class Hash

Public Instance Methods

deep_merge(*keys, val) click to toggle source
# File lib/ext.rb, line 49
def deep_merge(*keys, val)
  merge_target = keys.inject(self) { |h, k| h[k.numstr_to_i] }
  if keys.one?
    self[keys.last] = merge_target.merge(val)
  else
    if merge_target.kind_of?(Array)
      merge_to_array(*keys, merge_target, val)
    else
      merge_to_hash(*keys, merge_target, val)
    end
  end
  self
end
extract!(*keys) click to toggle source
# File lib/ext.rb, line 36
def extract!(*keys)
  keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) }
end
insert_after(key, obj) click to toggle source
# File lib/ext.rb, line 40
def insert_after(key, obj)
  splitter = self.keys.index(key)
  before_keys = self.keys[0..splitter]
  before = self.extract!(*before_keys)
  after = self.slice!(*before_keys)
  merged = before.merge(obj).merge(after)
  merged
end
slice(*keys) click to toggle source
# File lib/ext.rb, line 21
def slice(*keys)
  keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)
  keys.each_with_object(self.class.new) { |k, hash| hash[k] = self[k] if has_key?(k) }
end
slice!(*keys) click to toggle source
# File lib/ext.rb, line 26
def slice!(*keys)
  keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)
  omit = slice(*self.keys - keys)
  hash = slice(*keys)
  hash.default      = default
  hash.default_proc = default_proc if default_proc
  replace(hash)
  omit
end

Private Instance Methods

merge_to_array(*keys, target, val) click to toggle source
# File lib/ext.rb, line 65
def merge_to_array(*keys, target, val)
  last_key = keys.pop
  keys.inject(self) { |h, k| h[k.numstr_to_i] }[last_key.numstr_to_i] = target.push(val)
end
merge_to_hash(*keys, target, val) click to toggle source
# File lib/ext.rb, line 70
def merge_to_hash(*keys, target, val)
  last_key = keys.pop
  keys.inject(self) { |h, k| h[k.numstr_to_i] }[last_key.numstr_to_i] = target.merge(val)
end