Packages

Functional utilities for building custom predicates, orderings, and equivalences

Current section

Files

Jump to
ask src ask@ord.erl
Raw

src/ask@ord.erl

-module(ask@ord).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([trivial/0, get_equivalence/1, combine/2, between/3, clamp/3, pair/2, map_input/2]).
-spec trivial() -> fun((FOI, FOI) -> gleam@order:order()).
trivial() ->
fun(_, _) -> eq end.
-spec get_equivalence(fun((FOK, FOK) -> gleam@order:order())) -> fun((FOK, FOK) -> boolean()).
get_equivalence(Ord) ->
fun(Value, Other) -> (Value =:= Other) orelse (Ord(Value, Other) =:= eq) end.
-spec combine(
fun((FON, FON) -> gleam@order:order()),
fun((FON, FON) -> gleam@order:order())
) -> fun((FON, FON) -> gleam@order:order()).
combine(First, Second) ->
fun(Value, Other) -> _pipe = First(Value, Other),
gleam@order:lazy_break_tie(_pipe, fun() -> Second(Value, Other) end) end.
-spec between(fun((FOR, FOR) -> gleam@order:order()), FOR, FOR) -> fun((FOR) -> boolean()).
between(Ord, Lower, Upper) ->
fun(Value) ->
(Ord(Lower, Value) /= gt) andalso (Ord(Value, Upper) =:= lt)
end.
-spec clamp(fun((FOU, FOU) -> gleam@order:order()), FOU, FOU) -> fun((FOU) -> FOU).
clamp(Ord, Lower, Upper) ->
fun(Value) ->
gleam@bool:guard(
Ord(Value, Lower) =:= lt,
Lower,
fun() ->
gleam@bool:guard(
Ord(Value, Upper) =:= gt,
Upper,
fun() -> Value end
)
end
)
end.
-spec pair(
fun((FOX, FOX) -> gleam@order:order()),
fun((FOZ, FOZ) -> gleam@order:order())
) -> fun(({FOX, FOZ}, {FOX, FOZ}) -> gleam@order:order()).
pair(First, Second) ->
fun(Value, Other) ->
_pipe = First(erlang:element(1, Value), erlang:element(1, Other)),
gleam@order:lazy_break_tie(
_pipe,
fun() ->
Second(erlang:element(2, Value), erlang:element(2, Other))
end
)
end.
-spec map_input(fun((FPC, FPC) -> gleam@order:order()), fun((FPE) -> FPC)) -> fun((FPE, FPE) -> gleam@order:order()).
map_input(Ord, Fun) ->
fun(Value, Other) -> Ord(Fun(Value), Fun(Other)) end.