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