/// import { Cell, cell, Default, handler, lift, recipe, str } from "commontools"; type SortDirection = "asc" | "desc"; interface SortDirectionToggleArgs { count: Default; entries: Default; direction: Default; } const recordValue = handler( ( event: { amount?: number } | undefined, context: { count: Cell; entries: Cell }, ) => { const amount = typeof event?.amount === "number" ? event.amount : 1; const current = context.count.get(); const base = typeof current === "number" ? current : 0; const next = base + amount; context.count.set(next); const existing = context.entries.get(); const list = Array.isArray(existing) ? existing : []; context.entries.set([...list, next]); }, ); const toggleSortDirection = handler( ( event: { direction?: SortDirection } | undefined, context: { direction: Cell; history: Cell; }, ) => { const current = context.direction.get(); const currentDirection = current === "desc" ? "desc" : "asc"; const requested = event?.direction; const next = requested === "desc" ? "desc" : requested === "asc" ? "asc" : currentDirection === "asc" ? "desc" : "asc"; if (next !== currentDirection) { context.direction.set(next); } const previous = context.history.get(); const history = Array.isArray(previous) ? previous : []; const updates = [...history, next]; context.history.set(updates); }, ); export const counterWithSortDirectionToggle = recipe( "Counter With Sort Direction Toggle", ({ count, entries, direction }) => { const directionHistory = cell([]); const safeCount = lift((value: number | undefined) => typeof value === "number" ? value : 0 )(count); const safeEntries = lift((values: number[] | undefined) => Array.isArray(values) ? values : [] )(entries); const safeDirection = lift((value: SortDirection | undefined) => value === "desc" ? "desc" : "asc" )(direction); const sortedValues = lift( (input: { values: number[]; direction: SortDirection }) => { const sorted = [...input.values].sort((left, right) => input.direction === "desc" ? right - left : left - right ); return sorted; }, )({ values: safeEntries, direction: safeDirection }); const directionLabel = lift((value: SortDirection) => value === "desc" ? "descending" : "ascending" )(safeDirection); const sortedValuesLabel = lift((values: number[]) => values.length === 0 ? "[]" : `[${values.join(", ")}]` )(sortedValues); const directionHistoryView = lift( (history: SortDirection[] | undefined) => Array.isArray(history) ? history : [], )(directionHistory); const toggleDirection = toggleSortDirection({ direction, history: directionHistory, }); return { count, entries, direction: safeDirection, current: safeCount, values: safeEntries, sortedValues, directionLabel, sortedValuesLabel, directionHistory: directionHistoryView, label: str`Sorted ${directionLabel}: ${sortedValuesLabel}`, increment: recordValue({ count, entries }), toggleDirection, }; }, );