Class: Hash

Inherits:
Object
  • Object
show all
Defined in:
lib/ext.rb

Instance Method Summary collapse

Instance Method Details

#deep_merge(*keys, val) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
# 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) ⇒ Object



36
37
38
# 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) ⇒ Object



40
41
42
43
44
45
46
47
# 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) ⇒ Object



21
22
23
24
# 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) ⇒ Object



26
27
28
29
30
31
32
33
34
# 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