Current section
Files
Jump to
Current section
Files
lib/monoid/eq_all.ex
# 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