Class: Hash

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

Overview

Hash helpers

Instance Method Summary collapse

Instance Method Details

#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



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
84
85
# File 'lib/doing/hash.rb', line 58

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



40
41
42
# File 'lib/doing/hash.rb', line 40

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



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

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