export const compareSlots = compareElems => slotA => slotB => { if (slotA.depth < slotB.depth) { return -1; } if (slotB.depth < slotA.depth) { return 1; } return compareValues(compareElems)(slotA.value)(slotB.value); }; export const compareValues = compareElems => valA => valB => { if (valA.kind < valB.kind) { return -1; } if (valB.kind < valA.kind) { return 1; } if (valA.kind === "literal") { return compareElems(valA.out)(valB.out); } if (valA.kind === "read") { return compareSlots(compareElems)(valA.slot)(valB.slot); } if (valA.kind === "transformation") { const cmpIn = compareValues(compareElems)(valA.in)(valB.in); if (cmpIn !== 0) { return cmpIn; } return compareValues(compareElems)(valA.fn)(valB.fn); } };