import { compareDynamic } from "../compare/dynamic.js"; import { compareSymbols, compareInts } from "../compare/primitives.js"; import { makeTypeParser } from "../parser/type_parser.js"; import { newDynamic } from "../primitives/dynamic.js"; import { makeEnumCompareFn } from "../structures/enum.js"; import { makeStructCompareFn } from "../structures/struct.js"; import { Slot, Transformation, Value, Write } from "./value_slot.js"; // comparison functions are mutually recursive... export const compareSlot = makeEnumCompareFn([ { l: "new", r: () => compareSymbols }, { l: "write", r: () => compareWrite }, ]); export const compareWrite = makeStructCompareFn([ { l: "slot", r: () => compareSlot }, { l: "value", r: () => compareValue }, { l: "depth", r: () => compareInts }, ]); export const compareTransformation = makeStructCompareFn([ { l: "input", r: () => compareValue }, { l: "fn", r: () => compareValue }, { l: "output", r: () => compareDynamic }, ]); export const compareValue = makeEnumCompareFn([ { l: "literal", r: () => compareDynamic }, { l: "read", r: () => compareWrite }, { l: "transform", r: () => compareTransformation }, ]); const mkType = makeTypeParser({ extraPrimitives: [ ["Value", Value], ["Slot" , Slot ], ["Write", Write], ["Transformation", Transformation], ], }); export const ModuleVersioningCompare = [ // comparison ["compareSlot" , newDynamic(compareSlot )(mkType("Slot -> Slot -> Ordering"))], ["compareValue", newDynamic(compareValue)(mkType("Value -> Value -> Ordering"))], ["compareWrite", newDynamic(compareWrite)(mkType("Write -> Write -> Ordering"))], ["compareTransformation", newDynamic(compareTransformation)(mkType("Transformation -> Transformation -> Ordering"))], ];