defmodule Util.Ext.Map do @moduledoc false def atomify_keys(map) do Enum.reduce(map, %{}, fn({k,v}, acc) -> Map.merge(acc, %{Util.Ext.Term.to_atom(k) => v}) end) end def deep_merge(left, right) do Map.merge(left, right, &deep_resolve/3) end # Key exists in both maps, and both values are maps as well. # These can be merged recursively. defp deep_resolve(_key, left = %{}, right = %{}) do deep_merge(left, right) end # Key exists in both maps, but at least one of the values is # NOT a map. We fall back to standard merge behavior, preferring # the value on the right. defp deep_resolve(_key, _left, right) do right end end