Current section
Files
Jump to
Current section
Files
lib/monoid/eq_any.ex
# credo:disable-for-this-file
defmodule Funx.Monoid.Eq.Any do
@moduledoc """
A Monoid implementation for equality checks for Any.
"""
@type t :: %__MODULE__{
eq?: (any(), any() -> boolean()),
not_eq?: (any(), any() -> boolean())
}
defstruct eq?: &Funx.Monoid.Eq.Any.default_eq?/2,
not_eq?: &Funx.Monoid.Eq.Any.default_not_eq?/2
def default_eq?(_, _), do: false
def default_not_eq?(_, _), do: true
end
defimpl Funx.Monoid, for: Funx.Monoid.Eq.Any do
alias Funx.Eq.Utils
alias Funx.Monoid.Eq.Any
def empty(_), do: %Any{}
def append(%Any{} = eq1, %Any{} = eq2) do
%Any{
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(%Any{}, eq) do
eq = Utils.to_eq_map(eq)
%Any{
eq?: eq.eq?,
not_eq?: eq[:not_eq?]
}
end
def unwrap(%Any{eq?: eq?, not_eq?: not_eq?}) do
%{eq?: eq?, not_eq?: not_eq?}
end
end