-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.