# credo:disable-for-this-file defmodule Funx.Monoid.Eq.All do @moduledoc """ A Monoid implementation for equality checks for All. """ @type t :: %__MODULE__{ eq?: (any(), any() -> boolean()), not_eq?: (any(), any() -> boolean()) } defstruct eq?: &Funx.Monoid.Eq.All.default_eq?/2, not_eq?: &Funx.Monoid.Eq.All.default_not_eq?/2 def default_eq?(_, _), do: true def default_not_eq?(_, _), do: false end defimpl Funx.Monoid, for: Funx.Monoid.Eq.All do alias Funx.Eq.Utils alias Funx.Monoid.Eq.All def empty(_), do: %All{} def append(%All{} = eq1, %All{} = eq2) do %All{ eq?: fn a, b -> eq1.eq?.(a, b) && eq2.eq?.(a, b) end, not_eq?: fn a, b -> eq1.not_eq?.(a, b) || eq2.not_eq?.(a, b) end } end def wrap(%All{}, eq) do eq = Utils.to_eq_map(eq) %All{ eq?: eq.eq?, not_eq?: eq.not_eq? } end def unwrap(%All{eq?: eq?, not_eq?: not_eq?}) do %{eq?: eq?, not_eq?: not_eq?} end end