/// import { Cell, Default, handler, lift, recipe, str } from "commontools"; interface NestedCounterArgs { counters: Default< { left: Default; right: Default; }, { left: 0; right: 0 } >; } const adjustSingle = handler( ( event: { amount?: number } | undefined, context: { target: Cell }, ) => { const amount = typeof event?.amount === "number" ? event.amount : 1; context.target.set((context.target.get() ?? 0) + amount); }, ); const balanceCounters = handler( (_event: unknown, context: { left: Cell; right: Cell }) => { const leftValue = context.left.get() ?? 0; const rightValue = context.right.get() ?? 0; const average = Math.round((leftValue + rightValue) / 2); context.left.set(average); context.right.set(average); }, ); export const nestedCounters = recipe( "Nested Counters", ({ counters }) => { const left = counters.key("left"); const right = counters.key("right"); const total = lift((values: { left: number; right: number }) => values.left + values.right )({ left, right, }); return { label: str`Left ${left} • Right ${right}`, counters: { left, right }, total, controls: { incrementLeft: adjustSingle({ target: left }), incrementRight: adjustSingle({ target: right }), balance: balanceCounters({ left, right }), }, }; }, );