# 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