/// import { Cell, Default, handler, lift, recipe, str } from "commontools"; interface OptionalFallbackArgs { value?: number; defaultValue: Default; } const bumpWithFallback = handler( ( event: { amount?: number } | undefined, context: { value: Cell; defaultValue: Cell }, ) => { const amount = typeof event?.amount === "number" ? event.amount : 1; const currentRaw = context.value.get(); const fallback = context.defaultValue.get(); const base = typeof currentRaw === "number" ? currentRaw : typeof fallback === "number" ? fallback : 10; context.value.set(base + amount); }, ); export const counterWithOptionalFallback = recipe( "Counter With Optional Fallback", ({ value, defaultValue }) => { const safeDefault = lift((fallback: number | undefined) => typeof fallback === "number" ? fallback : 10 )(defaultValue); const safeValue = lift((inputs: { value?: number; fallback?: number }) => { if (typeof inputs.value === "number") return inputs.value; if (typeof inputs.fallback === "number") return inputs.fallback; return 10; })({ value, fallback: defaultValue }); return { value, defaultValue, current: safeValue, effectiveDefault: safeDefault, label: str`Value ${safeValue} (default ${safeDefault})`, increment: bumpWithFallback({ value, defaultValue }), }; }, );