Class: Hash

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

Overview

Hash helpers

Instance Method Summary collapse

Instance Method Details

#cloneObject



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

def clone
  Marshal.load(Marshal.dump(self))
end

#deep_freezeObject

Freeze all values in a hash

Returns:

  • Hash with all values frozen



11
12
13
14
15
16
17
18
# File 'lib/doing/hash.rb', line 11

def deep_freeze
  chilled = {}
  each do |k, v|
    chilled[k] = v.is_a?(Hash) ? v.deep_freeze : v.freeze
  end

  chilled.freeze
end

#deep_freeze!Object



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

def deep_freeze!
  replace deep_thaw.deep_freeze
end

#deep_set(path, value) ⇒ Object

Set a nested hash value using an array

Examples:

{}.deep_set(['one', 'two'], 'value')
# => { 'one' => { 'two' => 'value' } }

Parameters:

  • path (Array)

    key path

  • value

    The value



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/doing/hash.rb', line 62

def deep_set(path, value)
  if path.count == 1
    unless value.nil? || value =~ /^ *$/
      self[path[0]] = value
    else
      delete(path[0])
    end
  else
    if value
      self.default_proc = ->(h, k) { h[k] = Hash.new(&h.default_proc) }
      dig(*path[0..-2])[path.fetch(-1)] = value
    else
      return self unless dig(*path)

      dig(*path[0..-2]).delete(path.fetch(-1))
      path.pop
      cleaned = self
      path.each do |key|
        if cleaned[key].empty?
          cleaned.delete(key)
          break
        end
        cleaned = cleaned[key]
      end
      empty? ? nil : self
    end
  end
end

#deep_thawObject



24
25
26
27
28
29
30
31
# File 'lib/doing/hash.rb', line 24

def deep_thaw
  chilled = {}
  each do |k, v|
    chilled[k] = v.is_a?(Hash) ? v.deep_thaw : v.dup
  end

  chilled.dup
end

#deep_thaw!Object



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

def deep_thaw!
  replace deep_thaw
end

#stringify_keysObject

Turn all keys into string

Return a copy of the hash where all its keys are strings



44
45
46
# File 'lib/doing/hash.rb', line 44

def stringify_keys
  each_with_object({}) { |(k, v), hsh| hsh[k.to_s] = v.is_a?(Hash) ? v.stringify_keys : v }
end

#symbolize_keysObject

Turn all keys into symbols



49
50
51
# File 'lib/doing/hash.rb', line 49

def symbolize_keys
  each_with_object({}) { |(k, v), hsh| hsh[k.to_sym] = v.is_a?(Hash) ? v.symbolize_keys : v }
end