Module: Valuables::DeepFreeze

Defined in:
lib/valuables/deep_freeze.rb

Overview

Deep freezing functionality for Ruby objects

Freeze Ruby objects like a regular #freeze would do, but also freeze any included values. This comes with support for commonly used Ruby classes, such as Hash, Array and Range.

To make custom objects work with DeepFreeze, define a #deep_freeze method.

Class Method Summary collapse

Class Method Details

.deep_freeze(obj) ⇒ Object

Like Ruby’s #freeze but recurses into contained values.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/valuables/deep_freeze.rb', line 15

def deep_freeze(obj)
  case obj
  when ->(obj) { obj.respond_to?(:deep_freeze) }
    obj.deep_freeze
  when Hash
    obj.reduce({}) do |acc, (key, value)|
      acc.merge deep_freeze(key) => deep_freeze(value)
    end.freeze
  when Array
    obj.reduce([]) do |acc, value|
      acc << deep_freeze(value)
    end.freeze
  when Range
    deep_freeze(obj.begin)..deep_freeze(obj.end).freeze
  when Symbol, Fixnum, NilClass
    obj
  else
    obj.dup.freeze
  end
end