Scala deep-clone and merge for a JSON tree
Scala
enum Json:
case Str(value: String)
case Num(value: Double)
case Arr(items: Vector[Json])
case Obj(fields: Map[String, Json])
def deepClone(value: Json): Json = value match
case Json.Str(s) => Json.Str(s)
case Json.Num(n) => Json.Num(n)
case Json.Arr(xs) => Json.Arr(xs.map(deepClone))
case Json.Obj(fs) => Json.Obj(fs.map((k, v) => k -> deepClone(v)))
def deepMerge(base: Json, overlay: Json): Json = (base, overlay) match
case (Json.Obj(a), Json.Obj(b)) =>
Json.Obj(b.foldLeft(a) { case (acc, (k, v)) =>
acc.updated(k, acc.get(k).fold(deepClone(v))(existing => deepMerge(existing, v)))
})
case _ => deepClone(overlay)