Deep copy and recursive merge for Elixir maps
Elixir
defmodule DeepMerge do
def clone(term) when is_map(term), do: Map.new(term, fn {k, v} -> {k, clone(v)} end)
def clone(term) when is_list(term), do: Enum.map(term, &clone/1)
def clone(term), do: term
def merge(left, right) when is_map(left) and is_map(right) do
Map.merge(left, right, fn _key, a, b -> merge(a, b) end)
end
def merge(left, right) when is_list(left) and is_list(right), do: left ++ clone(right)
def merge(_left, right), do: clone(right)
end