F# deep clone and recursive merge for trees
F#
type Json =
| Null
| Bool of bool
| Num of float
| Str of string
| Arr of Json list
| Obj of Map<string, Json>
let rec clone value =
match value with
| Arr xs -> Arr(List.map clone xs)
| Obj m -> Obj(Map.map (fun _ v -> clone v) m)
| leaf -> leaf
let rec merge baseValue overrideValue =
match baseValue, overrideValue with
| Obj a, Obj b ->
b |> Map.fold (fun acc k v ->
let merged = match Map.tryFind k acc with Some old -> merge old v | None -> clone v
Map.add k merged acc) a |> Obj
| _, v -> clone v