Class: HashDiggable

Inherits:
DumbDelegator
  • Object
show all
Defined in:
lib/MrMurano/variegated/ruby_dig.rb

Instance Method Summary collapse

Constructor Details

#initialize(obj = nil) ⇒ HashDiggable

Returns a new instance of HashDiggable.



29
30
31
# File 'lib/MrMurano/variegated/ruby_dig.rb', line 29

def initialize(obj=nil)
  super(obj || {})
end

Instance Method Details

#a_diggable_hash?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/MrMurano/variegated/ruby_dig.rb', line 33

def a_diggable_hash?
  true
end

#deep_delete(key, *rest) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# File 'lib/MrMurano/variegated/ruby_dig.rb', line 64

def deep_delete(key, *rest)
  if rest.empty?
    delete(key)
  else
    keys = [key] + rest[0..-2]
    target = rest[-1]
    value = dig_safe(*keys)
    value.delete(target) if value.is_a? ::Hash
  end
end

#dig_safe(key, *rest) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/MrMurano/variegated/ruby_dig.rb', line 43

def dig_safe(key, *rest)
  value = self[key]

  if value.nil?
    value = self[key] = ::HashDiggable.new
  else
    begin
      value.a_diggable_hash?
      # Okay!
    rescue ::NoMethodError => _err
      value = self[key] = ::HashDiggable.new(value) if value.is_a? ::Hash
    end
  end

  if rest.empty?
    value
  else
    value.dig_safe(*rest)
  end
end

#fill_safe(value, *path) ⇒ Object



37
38
39
40
41
# File 'lib/MrMurano/variegated/ruby_dig.rb', line 37

def fill_safe(value, *path)
  sub_hash = self
  sub_hash = dig_safe(*path[0..-2]) if path.length > 1
  sub_hash[path[-1]] = value
end