rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
27 lines (24 loc) • 866 B
TypeScript
import type { Ord, Ord$GetTypeClass, Ordering } from ".";
import type { Args, Call2W, Cons, Fn } from "../../HKT";
import type { AssertOrdering, IsAny } from "../../helpers";
/**
* Compare two {@link Ord} instances.
*
* Sig: `(o1: Ord, o2: Ord) => Ordering`
*
* Type safety is **not guaranteed** if `O1` and `O2` are not of the same construct.
*/
export type Compare<O1 extends Ord, O2 extends Ord> = AssertOrdering<
IsAny<O2> extends true ? Ordering
: IsAny<O1> extends true ? Ordering
: Call2W<Ord$GetTypeClass<O1>["Compare"], O1, O2> extends infer U extends Ordering ? U
: never
>;
/**
* [Fn] Compare two {@link Ord} instances.
*
* Sig: `<O extends Cons<Ord>>(o1: O, o2: O) => Ordering`
*/
export default interface CompareFn<O extends Cons<Ord>> extends Fn<[O, O], Ordering> {
def: ([o1, o2]: Args<this>) => Compare<typeof o1, typeof o2>;
}