/// /** * Example: Consumer charm for charm linking. * Referenced in: docs/common/CHARM_LINKING.md * * @reviewed 2025-12-10 docs-rationalization */ import { Default, lift, NAME, pattern, UI } from "commontools"; interface Stats { average: number; count: number; min: number; max: number; } /** GPA Stats Reader */ interface Input { name: Default; gpaStats: Default; } const fmt = lift((n: number | undefined) => n !== undefined ? n.toFixed(2) : "—" ); const getAvg = lift((s: Stats | null) => s?.average); const getMin = lift((s: Stats | null) => s?.min); const getMax = lift((s: Stats | null) => s?.max); const getCount = lift((s: Stats | null) => s?.count ?? 0); export default pattern(({ name, gpaStats }) => { return { [NAME]: "GPA Reader", [UI]: ( GPA Statistics (Linked) Count: {getCount(gpaStats)} Average: {fmt(getAvg(gpaStats))} Min: {fmt(getMin(gpaStats))} Max: {fmt(getMax(gpaStats))} Data updates automatically when source changes. ), name, gpaStats, }; });
Data updates automatically when source changes.