37 lines
1.2 KiB
JavaScript
37 lines
1.2 KiB
JavaScript
// Total ordering of primitive types
|
|
|
|
export const compareInts = x => y => {
|
|
if (typeof(x) !== 'bigint' || typeof(y) !== 'bigint') {
|
|
throw new Error(`was only meant to compare bigints! got ${x} and ${y}`);
|
|
}
|
|
return (x < y) ? -1 : (x > y) ? 1 : 0;
|
|
};
|
|
|
|
export const compareDoubles = x => y => {
|
|
if (typeof(x) !== 'number' || typeof(y) !== 'number') {
|
|
throw new Error(`was only meant to compare numbers! got ${x} and ${y}`);
|
|
}
|
|
return (x < y) ? -1 : (x > y) ? 1 : 0;
|
|
};
|
|
|
|
export const compareStrings = x => y => {
|
|
if (typeof(x) !== 'string' || typeof(y) !== 'string') {
|
|
throw new Error(`was only meant to compare strings! got ${x} and ${y}`);
|
|
}
|
|
return (x < y) ? -1 : (x > y) ? 1 : 0;
|
|
};
|
|
|
|
export const compareBools = x => y => {
|
|
if (typeof(x) !== 'boolean' || typeof(y) !== 'boolean') {
|
|
throw new Error(`was only meant to compare booleans! got ${x} and ${y}`);
|
|
}
|
|
return x - y;
|
|
};
|
|
|
|
// The Unit-type has only one instance, which is equal to itself:
|
|
export const compareUnits = _ => _ => 0;
|
|
|
|
// Symbols are encoded as strings
|
|
export const compareSymbols = a => b => compareStrings(a)(b);
|
|
|
|
export const compareOrderings = a => b => compareDoubles(a)(b);
|