lib/epitools/rash.rb in epitools-0.5.103 vs lib/epitools/rash.rb in epitools-0.5.105

- old
+ new

@@ -6,55 +6,55 @@ # greeting = Rash.new( /^Mr./ => "Hello sir!", /^Mrs./ => "Evening, madame." ) # greeting["Mr. Steve Austin"] #=> "Hello sir!" # greeting["Mrs. Steve Austin"] #=> "Evening, madame." # class Rash - + attr_accessor :optimize_every - + def initialize(initial={}) @hash = {} @regexes = [] @ranges = [] @regex_counts = Hash.new(0) @optimize_every = 500 @lookups = 0 - + update(initial) end def update(other) for key, value in other self[key] = value end self end - + def []=(key, value) case key when Regexp #key = normalize_regex(key) # this used to just do: /#{regexp}/ @regexes << key when Range @ranges << key end @hash[key] = value end - + # # Return the first thing that matches the key. # def [](key) all(key).first end - + # # Return everything that matches the query. # def all(query) - return to_enum(:all, query) unless block_given? - + return to_enum(:all, query) unless block_given? + if @hash.include? query yield @hash[query] return end @@ -70,33 +70,33 @@ else yield value end end end - + when Integer - @ranges.each do |range| + @ranges.each do |range| yield @hash[range] if range.include? query end - + when Regexp # TODO: this doesn't seem very useful. should I ditch it? let me know! @hash.each do |key,val| - yield val if key.is_a? String and query =~ key + yield val if key.is_a? String and query =~ key end - + end - + end - + def method_missing(*args, &block) @hash.send(*args, &block) end private def optimize_if_necessary! - if (@lookups += 1) >= @optimize_every + if (@lookups += 1) >= @optimize_every @regexes = @regex_counts.sort_by { |regex,count| -count }.map { |regex,count| regex } @lookups = 0 end end