diff --git a/scripts/versioning2.js b/scripts/versioning2.js new file mode 100644 index 0000000..174a615 --- /dev/null +++ b/scripts/versioning2.js @@ -0,0 +1,66 @@ +import { pretty } from "../util/pretty.js"; +import { inspect } from "node:util"; + +// UUID -> Computation -> Slot +const newSlot = uuid => computation => ({ + overwrites: uuid, + computation, + // depth: 1, + // [inspect.custom]: (depth, options, inspect) => options.stylize(`newSlot(${inspect(uuid)})(${inspect(computation)})`, 'special'), +}); + +// a -> Computation +const newValue = val => ({ + kind: "value", + out: val, + // [inspect.custom]: (depth, options, inspect) => options.stylize(`newValue(${val})`, 'special'), +}); + +// Slot -> Computation +const read = slot => ({ + kind: "transformation", + in: slot, + fn: `${x => x}`, + out: slot.computation.out, + // [inspect.custom]: (depth, options, inspect) => options.stylize(`read(${inspect(slot)})`, 'special'), +}); + +// Computation -> Computation b> -> Computation +const transform = input => fn => { + const output = fn.out(input.out); + if (input.kind === "value") { + // our input had no read dependency, thus likewise our output does not: + return { + kind: "value", + out: output, + }; + } + else { + return { + kind: "transformation", + in: input.in, + fn, + out: output, + }; + } +}; + + + +const price = newSlot(Symbol('price'))(newValue(5)); +const tax = newSlot(Symbol('tax'))(newValue(1)); + +const total = + transform(read(price))( + transform(read(tax))( + newValue(tax => price => price + tax))); + +console.log(pretty({total,})); + + + +const getReadDependencies = computation => new Set([ + ...(computation.kind === "value" ? [] : [computation.in, ...getReadDependencies(computation.fn)]), +]); + +console.log("getReadDependencies(total):", getReadDependencies(total));