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)
}
}