Deep clone and merge JSON::Any trees

Crystal
require "json"

def deep_clone(value : JSON::Any) : JSON::Any
  case raw = value.raw
  when Hash
    JSON::Any.new(raw.transform_values { |v| deep_clone(v) })
  when Array
    JSON::Any.new(raw.map { |v| deep_clone(v) })
  else
    value
  end
end

def deep_merge(base : JSON::Any, patch : JSON::Any) : JSON::Any
  bh, ph = base.as_h?, patch.as_h?
  return deep_clone(patch) unless bh && ph
  merged = bh.dup
  ph.each { |key, value| merged[key] = merged.has_key?(key) ? deep_merge(merged[key], value) : deep_clone(value) }
  JSON::Any.new(merged)
end