// 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} (${typeof(x)}) and ${y} (${typeof(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} (${typeof(x)}) and ${y} (${typeof(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);