// Total ordering of primitive types import { getSymbol } from "../type_constructor.js"; export const compareNumbers = 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 = x => y => 0; export const compareTypes = x => y => { return compareSymbols(getSymbol(x))(getSymbol(y)) || compareNumbers(x.params.length)(y.params.length) || x.params.reduce((acc, _, i) => acc || compareTypes(x.params[i])(y.params[i]), 0) } // Note: dirty assumption that every symbol has unique description. // This will be fixed once we move from symbols to real UUIDs. export const compareSymbols = a => b => (a !== b) && compareStrings(a.description)(b.description);