class Hamster::Hash

def all?

def all?
  each { |key, value| return false unless yield(key, value) } if block_given?
  true
end

def any?

def any?
  return !empty? unless block_given?
  each { |key, value| return true if yield(key, value) }
  false
end

def delete(key)

def delete(key)
  trie = @trie.delete(key)
  if trie.equal?(@trie)
    self
  else
    self.class.new(trie)
  end
end

def dup

def dup
  self
end

def each

def each
  return self unless block_given?
  @trie.each { |entry| yield(entry.key, entry.value) }
end

def empty?

def empty?
  @trie.empty?
end

def eql?(other)

def eql?(other)
  other.is_a?(self.class) && @trie.eql?(other.instance_eval{@trie})
end

def filter

def filter
  return self unless block_given?
  trie = @trie.filter { |entry| yield(entry.key, entry.value) }
  if trie.equal?(@trie)
    self
  else
    self.class.new(trie)
  end
end

def find

def find
  return nil unless block_given?
  each { |key, value| return Tuple.new(key, value) if yield(key, value) }
  nil
end

def get(key)

def get(key)
  entry = @trie.get(key)
  return entry.value if entry
end

def has_key?(key)

def has_key?(key)
  @trie.has_key?(key)
end

def initialize(trie = Trie.new)

def initialize(trie = Trie.new)
  @trie = trie
end

def inspect

def inspect
  "{#{reduce([]) { |memo, key, value| memo << "#{key.inspect} => #{value.inspect}"}.join(", ")}}"
end

def map

def map
  return self unless block_given?
  return self if empty?
  self.class.new(@trie.reduce(Trie.new) { |trie, entry| trie.put(*yield(entry.key, entry.value)) })
end

def none?

def none?
  return empty? unless block_given?
  each { |key, value| return false if yield(key, value) }
  true
end

def put(key, value)

def put(key, value)
  self.class.new(@trie.put(key, value))
end

def reduce(memo)

def reduce(memo)
  return memo unless block_given?
  @trie.reduce(memo) { |memo, entry| yield(memo, entry.key, entry.value) }
end

def remove

def remove
  return self unless block_given?
  filter { |key, value| !yield(key, value) }
end

def size

def size
  @trie.size
end