import type { Eq } from './Eq' import type { Ordering } from './Ordering' export interface Ord extends Eq { readonly compare_: CompareFn_ readonly compare: CompareFn } export interface CompareFn { (y: A): (x: A) => Ordering } export interface CompareFn_ { (x: A, y: A): Ordering } export function Ord(compare: (x: A, y: A) => Ordering, equals?: (x: A, y: A) => boolean): Ord { const equals_ = equals ?? ((x, y) => compare(x, y) === 0) return { compare_: compare, compare: (y) => (x) => compare(x, y), equals_, equals: (y) => (x) => equals_(x, y) } }