module T::Props::Utils

def self.deep_clone_object(what, freeze: false)

types and Hashes and Arrays.
Deep copy an object. The object must consist of Ruby primitive
def self.deep_clone_object(what, freeze: false)
  result = case what
  when true
    true
  when false
    false
  when Symbol, NilClass, Numeric
    what
  when Array
    what.map {|v| deep_clone_object(v, freeze: freeze)}
  when Hash
    h = what.class.new
    what.each do |k, v|
      k.freeze if freeze
      h[k] = deep_clone_object(v, freeze: freeze)
    end
    h
  when Regexp
    what.dup
  when T::Enum
    what
  else
    what.clone
  end
  freeze ? result.freeze : result
end