/// /** * 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, }; });