/// import { Cell, Default, handler, lift, recipe, str } from "commontools"; interface MutableTupleArgs { pair: Default<[number, number], [0, 0]>; } const setPair = handler( ( event: { left?: number; right?: number } | undefined, context: { pair: Cell<[number, number]> }, ) => { const left = typeof event?.left === "number" ? event.left : 0; const right = typeof event?.right === "number" ? event.right : 0; context.pair.set([left, right]); }, ); const adjustPair = handler( ( event: { left?: number; right?: number } | undefined, context: { pair: Cell<[number, number]> }, ) => { const current = context.pair.get() ?? [0, 0]; const leftDelta = typeof event?.left === "number" ? event.left : 0; const rightDelta = typeof event?.right === "number" ? event.right : 0; context.pair.set([ current[0] + leftDelta, current[1] + rightDelta, ]); }, ); export const counterWithMutableTuple = recipe( "Counter With Mutable Tuple", ({ pair }) => { const tuple = lift((values: [number, number] | undefined) => { const leftValue = Array.isArray(values) && typeof values[0] === "number" ? values[0] : 0; const rightValue = Array.isArray(values) && typeof values[1] === "number" ? values[1] : 0; return [leftValue, rightValue] as [number, number]; })(pair); const left = lift((values: [number, number]) => values[0])(tuple); const right = lift((values: [number, number]) => values[1])(tuple); const sum = lift((values: [number, number]) => values[0] + values[1])( tuple, ); const label = str`Tuple (${left}, ${right}) sum ${sum}`; return { pair, tuple, left, right, sum, label, set: setPair({ pair }), adjust: adjustPair({ pair }), }; }, );