Budget Tracker
A budget is an ordered vector of entries. Each entry is a map:
{:id 1 :label "Groceries" :amount 4250}
Amounts are integer minor units (cents). Floats never touch a balance;
formatting to a display string is the caller's concern (fmt-amount).
Storage sits behind an IStorage protocol – a two-method key/value store
holding one serialized budget in a single string slot. The JVM binding is an
in-memory atom; the browser binding wraps js/localStorage. The pipeline test
is the same on both: add an entry, total it, remove it.
Status
Core-only. core.cljc and storage.cljc are complete; app.cljs is a stub
init! that logs the version and exposes window._budgetTracker. There is no
UI on this page yet.
| Piece | Namespace | State |
|---|---|---|
| Pure logic | wal-sh.projects.budget-tracker.core |
complete |
| Storage protocol impls | wal-sh.projects.budget-tracker.storage |
complete |
| Browser adapter | wal-sh.projects.budget-tracker.browser |
complete |
| SPA entry | wal-sh.projects.budget-tracker.app |
stub |
8 example-based tests and 15 test.check properties are defined under
test/wal_sh/projects/budget_tracker/.
The shadow-cljs build :projects-budget-tracker emits to
site/static/js/projects/budget-tracker/.