View Source Funx.Ord.Utils (funx v0.1.7)
Utility functions for working with the Funx.Ord protocol.
These functions assume that types passed in either support Elixir's comparison operators
or implement the Funx.Ord protocol.
Summary
Functions
Appends two Ord instances, combining their comparison logic.
Checks if value is between min and max, inclusive, with an optional custom Ord.
Clamps a value between min and max, with an optional custom Ord.
Creates a comparator function from the given Ord module, returning true
if a is less than or equal to b according to the module’s ordering.
Compares two values and returns :lt, :eq, or :gt, with an optional custom Ord.
Concatenates a list of Ord instances into a single composite comparator.
Transforms an ordering by applying a function f to values before comparison.
Returns the maximum of two values, with an optional custom Ord.
Returns the minimum of two values, with an optional custom Ord.
Reverses the ordering logic.
Converts an Ord instance into an equality comparator.
Types
@type ord_t() :: Funx.Ord.t() | ord_map()
Functions
@spec append(Funx.Monoid.Ord.t(), Funx.Monoid.Ord.t()) :: Funx.Monoid.Ord.t()
Appends two Ord instances, combining their comparison logic.
If the first Ord comparator determines an order, that result is used.
If not, the second comparator is used as a fallback.
Examples
iex> ord1 = Funx.Ord.Utils.contramap(& &1.age, Funx.Ord.Any)
iex> ord2 = Funx.Ord.Utils.contramap(& &1.name, Funx.Ord.Any)
iex> combined = Funx.Ord.Utils.append(ord1, ord2)
iex> combined.lt?.(%{age: 30, name: "Alice"}, %{age: 30, name: "Bob"})
true
Checks if value is between min and max, inclusive, with an optional custom Ord.
Examples
iex> Funx.Ord.Utils.between(5, 1, 10)
true
iex> Funx.Ord.Utils.between(0, 1, 10)
false
iex> Funx.Ord.Utils.between(11, 1, 10)
false
Clamps a value between min and max, with an optional custom Ord.
Examples
iex> Funx.Ord.Utils.clamp(5, 1, 10)
5
iex> Funx.Ord.Utils.clamp(0, 1, 10)
1
iex> Funx.Ord.Utils.clamp(15, 1, 10)
10
Creates a comparator function from the given Ord module, returning true
if a is less than or equal to b according to the module’s ordering.
Useful for sorting with Enum.sort/2 or similar functions.
Examples
iex> comparator = Funx.Ord.Utils.comparator(Funx.Ord.Any)
iex> Enum.sort([3, 1, 2], comparator)
[1, 2, 3]
Compares two values and returns :lt, :eq, or :gt, with an optional custom Ord.
Examples
iex> Funx.Ord.Utils.compare(3, 5)
:lt
iex> Funx.Ord.Utils.compare(7, 7)
:eq
iex> Funx.Ord.Utils.compare(9, 4)
:gt
@spec concat([Funx.Monoid.Ord.t()]) :: Funx.Monoid.Ord.t()
Concatenates a list of Ord instances into a single composite comparator.
This function reduces a list of Ord comparators into a single Ord,
applying them in sequence until an order is determined.
Examples
iex> ord_list = [
...> Funx.Ord.Utils.contramap(& &1.age, Funx.Ord.Any),
...> Funx.Ord.Utils.contramap(& &1.name, Funx.Ord.Any)
...> ]
iex> combined = Funx.Ord.Utils.concat(ord_list)
iex> combined.gt?.(%{age: 25, name: "Charlie"}, %{age: 25, name: "Bob"})
true
Transforms an ordering by applying a function f to values before comparison.
The ord parameter can be an Ord module or a custom comparator map with comparison functions (:lt?, :le?, :gt?, and :ge?).
When an Ord module is provided, it wraps the module’s functions to apply f to each value before invoking the comparison.
If a custom comparator map is provided, it wraps the functions in the map to apply f to each value.
Examples
iex> ord = Funx.Ord.Utils.contramap(&String.length/1, Funx.Ord.Any)
iex> ord.lt?.("cat", "zebra")
true
Returns the maximum of two values, with an optional custom Ord.
Examples
iex> Funx.Ord.Utils.max(3, 5)
5
iex> ord = Funx.Ord.Utils.contramap(&String.length/1, Funx.Ord.Any)
iex> Funx.Ord.Utils.max("cat", "zebra", ord)
"zebra"
Returns the minimum of two values, with an optional custom Ord.
Examples
iex> Funx.Ord.Utils.min(10, 7)
7
iex> ord = Funx.Ord.Utils.contramap(&String.length/1, Funx.Ord.Any)
iex> Funx.Ord.Utils.min("apple", "kiwi", ord)
"kiwi"
Reverses the ordering logic.
Examples
iex> ord = Funx.Ord.Utils.reverse(Funx.Ord.Any)
iex> ord.lt?.(10, 5)
true
@spec to_eq(ord_t()) :: Funx.Eq.Utils.eq_map()
Converts an Ord instance into an equality comparator.
This function creates a map containing two functions:
eq?/2: Returnstrueifaandbare considered equal by the givenOrd.not_eq?/2: Returnstrueifaandbare not considered equal by the givenOrd.
Examples
iex> eq = Funx.Ord.Utils.to_eq(Funx.Ord.Any)
iex> eq.eq?.(5, 5)
true