1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
require 'tins/thread_local'
module Tins
module HashSymbolizeKeysRecursive
extend Tins::ThreadLocal
thread_local :seen
def symbolize_keys_recursive(circular: nil)
self.seen = {}
_symbolize_keys_recursive(self, circular: circular)
ensure
self.seen = nil
end
def symbolize_keys_recursive!(circular: nil)
replace symbolize_keys_recursive(circular: circular)
end
private
def _symbolize_keys_recursive(object, circular: nil)
case
when seen[object.__id__]
object = circular
when Hash === object
seen[object.__id__] = true
new_object = object.class.new
seen[new_object.__id__] = true
object.each do |k, v|
new_object[k.to_s.to_sym] = _symbolize_keys_recursive(v, circular: circular)
end
object = new_object
when Array === object
seen[object.__id__] = true
new_object = object.class.new(object.size)
seen[new_object.__id__] = true
object.each_with_index do |v, i|
new_object[i] = _symbolize_keys_recursive(v, circular: circular)
end
object = new_object
end
object
end
end
end
require 'tins/alias'
|