Class: Hash

Inherits:
Object show all
Defined in:
lib/mumukit/core/hash.rb

Instance Method Summary collapse

Instance Method Details

#amend(other) ⇒ Object



37
38
39
# File 'lib/mumukit/core/hash.rb', line 37

def amend(other)
  other.merge(self)
end

#deep_diff(other) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/mumukit/core/hash.rb', line 47

def deep_diff(other)
  diff = diff(other)
  deep_diff = diff.dup
  deep_deletions = deep_diff[:deletions]
  deep_additions = deep_diff[:additions]

  diff[:deletions].each do |k, v|
    added_v = diff[:additions][k]
    next if !diff[:additions].include?(k) || v.class != added_v.class
    if Array === v
      if v.size == added_v.size
        values = v.zip(added_v)
        deep_deletions[k] = []
        deep_additions[k] = []
        values.select { |v1, v2| v1 != v2 }.each do |v1, v2|
          if Hash === v1 && Hash === v2
            sub_diff = v1.deep_diff(v2)
            deep_deletions[k] << sub_diff[:deletions]
            deep_additions[k] << sub_diff[:additions]
          else
            deep_deletions[k] << v1
            deep_additions[k] << v2
          end
        end
      else
        deep_deletions[k] = v - added_v
        deep_additions[k] = added_v - v
      end
    elsif Hash === v
      sub_diff = v.deep_diff(added_v)
      deep_deletions[k] = sub_diff[:deletions]
      deep_additions[k] = sub_diff[:additions]
    end
  end

  deep_diff
end

#diff(other) ⇒ Object



41
42
43
44
45
# File 'lib/mumukit/core/hash.rb', line 41

def diff(other)
  s1 = Set.new(self)
  s2 = Set.new(other)
  { deletions: (s1 - s2).to_h, additions: (s2 - s1).to_h }
end

#dig(key, *keys) ⇒ Object



5
6
7
8
9
10
11
12
# File 'lib/mumukit/core/hash.rb', line 5

def dig(key, *keys)
  value = self[key]
  if !value.nil? && !keys.empty?
    value.dig(*keys)
  else
    value
  end
end

#indifferent_delete(key) ⇒ Object



15
16
17
18
# File 'lib/mumukit/core/hash.rb', line 15

def indifferent_delete(key)
  string_value = delete(key.to_s)
  delete(key.to_sym) || string_value
end

#indifferent_get(key) ⇒ Object



20
21
22
# File 'lib/mumukit/core/hash.rb', line 20

def indifferent_get(key)
  self[key.to_sym] || self[key.to_s]
end

#replace_key(original, replacement) ⇒ Object



24
25
26
# File 'lib/mumukit/core/hash.rb', line 24

def replace_key(original, replacement)
  dup.replace_key! original, replacement
end

#replace_key!(original, replacement) ⇒ Object



28
29
30
31
# File 'lib/mumukit/core/hash.rb', line 28

def replace_key!(original, replacement)
  self[replacement] = delete(original) if include?(original)
  self
end

#to_structObject



33
34
35
# File 'lib/mumukit/core/hash.rb', line 33

def to_struct
  OpenStruct.new self
end