/// import { Cell, Default, handler, lift, recipe, str } from "commontools"; const bump = handler( ( event: { amount?: number } | undefined, context: { value: Cell }, ) => { const amount = typeof event?.amount === "number" ? event.amount : 1; context.value.set((context.value.get() ?? 0) + amount); }, ); const mirrorRight = handler( (_event: unknown, context: { left: Cell; right: Cell }) => { const leftValue = context.left.get() ?? 0; context.right.set(leftValue); }, ); const childCounter = recipe<{ value: Default }>( "Child Counter", ({ value }) => { return { label: str`Value ${value}`, value, increment: bump({ value }), }; }, ); interface ComposedCounterArgs { left: Default; right: Default; } export const composedCounters = recipe( "Composed Counters", ({ left, right }) => { const leftCounter = childCounter({ value: left }); const rightCounter = childCounter({ value: right }); const total = lift((values: { left: number; right: number }) => values.left + values.right )({ left: leftCounter.key("value"), right: rightCounter.key("value"), }); return { left: leftCounter, right: rightCounter, total, actions: { mirrorRight: mirrorRight({ left: leftCounter.key("value"), right: rightCounter.key("value"), }), }, }; }, );