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
# File 'lib/valuables/deep_freeze.rb', line 15

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