summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjluehrs2 <jluehrs2@uiuc.edu>2008-01-31 16:31:52 -0500
committerjluehrs2 <jluehrs2@uiuc.edu>2008-01-31 16:31:52 -0500
commitf125e1ec13d2f7a6478d2cdffd23e0fafcdf46b0 (patch)
treeb300ee7f62eb70ce00eaac8fa7416f7d7a978bc8
parent4370d339310435cafdf8185c54526f4d7ceaa2c5 (diff)
downloadgames-word-f125e1ec13d2f7a6478d2cdffd23e0fafcdf46b0.tar.gz
games-word-f125e1ec13d2f7a6478d2cdffd23e0fafcdf46b0.zip
add a caching option to random_word and is_word
-rw-r--r--lib/Games/Word.pm42
1 files changed, 40 insertions, 2 deletions
diff --git a/lib/Games/Word.pm b/lib/Games/Word.pm
index 88d3d56..9ec9403 100644
--- a/lib/Games/Word.pm
+++ b/lib/Games/Word.pm
@@ -11,12 +11,36 @@ use Math::Combinatorics qw/factorial/;
use Test::Deep::NoTest;
my $word_list = '';
+my $cache = 1;
+my %words = ();
+my @words = ();
sub set_word_list {
$word_list = shift;
+ die "Can't read word list: $word_list" unless -r $word_list;
+ die "Empty word list: $word_list" unless -s $word_list;
+ my %args = (cache => 1, @_);
+ if ($args{cache}) {
+ open my $fh, $word_list or die "Opening $word_list failed";
+ for (<$fh>) {
+ chomp;
+ $words{$_} = 1;
+ }
+ @words = keys %words;
+ $cache = 1;
+ }
+ else {
+ $cache = 0;
+ }
+
}
-sub random_word {
+sub _random_word_cache {
+ die "No words in word list" unless keys %words;
+ return $words[int(rand(@words))];
+}
+
+sub _random_word_nocache {
my $word;
open my $fh, '<', $word_list or die "Opening $word_list failed";
@@ -28,7 +52,16 @@ sub random_word {
return $word;
}
-sub is_word {
+sub random_word {
+ return _random_word_cache if $cache;
+ return _random_word_nocache;
+}
+
+sub _is_word_cache {
+ return $words{$_[0]};
+}
+
+sub _is_word_nocache {
my $word = shift;
open my $fh, '<', $word_list
@@ -41,6 +74,11 @@ sub is_word {
return 0;
}
+sub is_word {
+ return _is_word_cache(@_) if $cache;
+ return _is_word_nocache(@_);
+}
+
sub random_permutation {
my $word = shift;
return '' if $word eq '';