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 = AssertOrdering< IsAny extends true ? Ordering : IsAny extends true ? Ordering : Call2W["Compare"], O1, O2> extends infer U extends Ordering ? U : never >; /** * [Fn] Compare two {@link Ord} instances. * * Sig: `>(o1: O, o2: O) => Ordering` */ export default interface CompareFn> extends Fn<[O, O], Ordering> { def: ([o1, o2]: Args) => Compare; }