class MultiKeyHash
Constants
- VERSION
Public Class Methods
new(values = nil)
click to toggle source
# File lib/multi_key_hash.rb, line 5 def initialize(values = nil) @next_key = 1 @outer = @inner = {} order_values(values) end
Public Instance Methods
[](outer_key)
click to toggle source
# File lib/multi_key_hash.rb, line 11 def [](outer_key) @outer[outer_key].nil? ? nil : @inner[@outer[outer_key]] end
[]=(outer_key, new_value)
click to toggle source
# File lib/multi_key_hash.rb, line 15 def []=(outer_key, new_value) if outer_key.is_a?(Array) && !outer_key.empty? order_values(outer_key, new_value) else inner_key = @inner.select do |_, existing| existing == new_value end.map do |key, _| key end.first if inner_key @outer[outer_key] = inner_key else remove_hex_key(outer_key) uniq_key = generate_uniq @outer[outer_key] = uniq_key @inner[uniq_key] = new_value @next_key += 1 end end end
delete(key)
click to toggle source
# File lib/multi_key_hash.rb, line 50 def delete(key) remove_hex_key(key) delete_key(key) end
to_h()
click to toggle source
# File lib/multi_key_hash.rb, line 37 def to_h converted = {} @inner.each do |i_key, i_value| @outer.each do |o_key, o_value| if i_value == o_key converted[i_key] = o_value end end end converted end
Private Instance Methods
delete_key(key)
click to toggle source
# File lib/multi_key_hash.rb, line 83 def delete_key(key) @outer.delete(key) @inner.delete(key) end
generate_uniq()
click to toggle source
# File lib/multi_key_hash.rb, line 88 def generate_uniq Digest::SHA1.hexdigest(@next_key.to_s)[8..16] end
multiple_presence(key)
click to toggle source
# File lib/multi_key_hash.rb, line 77 def multiple_presence(key) @outer.count do |el| el[1] == key end end
order_values(values, ar = nil)
click to toggle source
# File lib/multi_key_hash.rb, line 57 def order_values(values, ar = nil) values&.each do |keys, value| if keys.is_a?(Array) && !keys.empty? keys.each do |key| self[key] = value end else self[keys] = ar || value end end end
remove_hex_key(outer_key)
click to toggle source
# File lib/multi_key_hash.rb, line 69 def remove_hex_key(outer_key) check_key = @outer[outer_key] if multiple_presence(check_key) == 1 delete_key(check_key) end end