Object
FuzzyHash is a weird hash with special semantics for regex keys.
This is useful when you want to have a lookup table that can either contain strings or regexes. For instance, you might want a catch all for certain regexes that perform a certain logic.
>> hash = FuzzyHash.new >> hash[/^\d+$/] = 'number' >> hash[/.*/] = 'something' >> hash['chunky'] = 'bacon' >> hash['foo'] = 'vader' >> hash['foo'] << 'vader' >> hash['food'] << 'something' >> hash['123'] << 'number'
This class is based on Joshua Hull's original FuzzyHash class.
# File lib/hashery/fuzzy_hash.rb, line 61 def ==(o) o.is_a?(FuzzyHash) o.send(:hash) == hash && o.send(:fuzzies) == fuzzies end
# File lib/hashery/fuzzy_hash.rb, line 144 def [](key) (hash.key?(key) && hash[key]) || ((lookup = fuzzy_lookup(key)) && lookup && lookup.first) || fuzzy_hash[key] end
# File lib/hashery/fuzzy_hash.rb, line 106 def []=(key, value) if Regexp === key fuzzies.delete_if{|f| f.first.inspect.hash == key.inspect.hash} fuzzies_reverse.delete_if{|k, v| v[1].inspect.hash == key.inspect.hash} hash_reverse.delete_if{|k,v| v.inspect.hash == key.inspect.hash} fuzzy_hash[key] = value fuzzies << [key, value] reset_fuzz_test! fuzzies_reverse[value] = [fuzzies.size - 1, key, value] else hash[key] = value hash_reverse.delete_if{|k,v| v.hash == key.hash} hash_reverse[value] = key end value end
# File lib/hashery/fuzzy_hash.rb, line 42 def clear hash.clear fuzzies.clear hash_reverse.clear fuzzies_reverse.clear end
# File lib/hashery/fuzzy_hash.rb, line 99 def delete_value(value) hash.delete(hash_reverse[value]) || ((rr = fuzzies_reverse[value]) && fuzzies.delete_at(rr[0])) end
# File lib/hashery/fuzzy_hash.rb, line 91 def each hash.each{|k,v| yield k,v } fuzzies.each{|v| yield v.first, v.last } end
# File lib/hashery/fuzzy_hash.rb, line 70 def empty? hash.empty? && fuzzies.empty? end
# File lib/hashery/fuzzy_hash.rb, line 77 def keys hash.keys + fuzzy_hash.keys end
# File lib/hashery/fuzzy_hash.rb, line 153 def match_with_result(key) if hash.key?(key) [hash[key], key] else fuzzy_lookup(key) end end
# File lib/hashery/fuzzy_hash.rb, line 127 def replace(src, dest) if hash_reverse.key?(src) key = hash_reverse[src] hash[key] = dest hash_reverse.delete(src) hash_reverse[dest] = key elsif fuzzies_reverse.key?(src) key = fuzzies_reverse[src] fuzzies[rkey[0]] = [rkey[1], dest] fuzzies_reverse.delete(src) fuzzies_reverse[dest] = [rkey[0], rkey[1], dest] end end
# File lib/hashery/fuzzy_hash.rb, line 52 def size hash.size + fuzzies.size end
Generated with the Darkfish Rdoc Generator 2.