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