lib/helper/deep_merge.ex

# Copyright (c) 2021 Anand Panchapakesan
#
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT

defmodule Helper.DeepMerge do
  @moduledoc """
  Deep merge an enumerable into another.

  This is a skin over an existing library deep_merge in [github](https://github.com/danielsdeleo/deep_merge).
  Many thanks to @danielsdeleo for making this library available.

  This module exposes one function, viz: merge/2, that can deep merge two lists or two maps or a list and a
  map in any order.
  """

  @typedoc """
  Enumerator types for merge
  """
  @type t() :: keyword() | map()

  @doc """
  Deep merge a keyword list or a map
  """
  @spec merge(t1, t2) :: t1 when t1: t(), t2: t()
  def merge(t1, t1)
  def merge(l1, l2) when is_list(l1) and is_list(l2), do: DeepMerge.deep_merge(l1, l2)
  def merge(m1, m2) when is_map(m1) and is_map(m2), do: DeepMerge.deep_merge(m1, m2)
  def merge(l1, m2) when is_list(l1) and is_map(m2), do: DeepMerge.deep_merge(l1, Enum.into(m2, []))
  def merge(m1, l2) when is_map(m1) and is_list(l2), do: DeepMerge.deep_merge(m1, Enum.into(l2, %{}))
  def merge(a1, a2), do: DeepMerge.deep_merge(a1, a2)
end