diff options
author | jluehrs2 <jluehrs2@uiuc.edu> | 2008-01-31 16:31:52 -0500 |
---|---|---|
committer | jluehrs2 <jluehrs2@uiuc.edu> | 2008-01-31 16:31:52 -0500 |
commit | f125e1ec13d2f7a6478d2cdffd23e0fafcdf46b0 (patch) | |
tree | b300ee7f62eb70ce00eaac8fa7416f7d7a978bc8 /lib/Games/Word.pm | |
parent | 4370d339310435cafdf8185c54526f4d7ceaa2c5 (diff) | |
download | games-word-f125e1ec13d2f7a6478d2cdffd23e0fafcdf46b0.tar.gz games-word-f125e1ec13d2f7a6478d2cdffd23e0fafcdf46b0.zip |
add a caching option to random_word and is_word
Diffstat (limited to 'lib/Games/Word.pm')
-rw-r--r-- | lib/Games/Word.pm | 42 |
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 ''; |