class RecursiveOpenStruct::DeepDup
Public Class Methods
new(opts={})
click to toggle source
# File lib/recursive_open_struct/deep_dup.rb, line 3 def initialize(opts={}) @recurse_over_arrays = opts.fetch(:recurse_over_arrays, false) @preserve_original_keys = opts.fetch(:preserve_original_keys, false) end
Public Instance Methods
call(obj)
click to toggle source
# File lib/recursive_open_struct/deep_dup.rb, line 8 def call(obj) deep_dup(obj) end
Private Instance Methods
deep_dup(obj, visited=Set.new)
click to toggle source
# File lib/recursive_open_struct/deep_dup.rb, line 14 def deep_dup(obj, visited=Set.new) if obj.is_a?(Hash) obj.each_with_object({}) do |(key, value), h| h[@preserve_original_keys ? key : key.to_sym] = value_or_deep_dup(value, visited) end elsif obj.is_a?(Array) && @recurse_over_arrays obj.each_with_object([]) do |value, arr| value = value.is_a?(RecursiveOpenStruct) ? value.to_h : value arr << value_or_deep_dup(value, visited) end else obj end end
value_or_deep_dup(value, visited)
click to toggle source
# File lib/recursive_open_struct/deep_dup.rb, line 29 def value_or_deep_dup(value, visited) obj_id = value.object_id visited.include?(obj_id) ? value : deep_dup(value, visited << obj_id) end