Universalist
Intent
Use Algebra-Driven Design (ADD) to find the smallest algebra that fits the domain, encode it in types, and enforce laws with tests.
Core workflow (ADD)
- •Frame the domain: observations, invariants, operations.
- •Pick the minimal algebra; avoid overfitting.
- •Define types: make illegal states unrepresentable.
- •State laws: identity, associativity, distributivity, absorption, round-trip, homomorphism.
- •Derive operations from the algebra (map/fold/compose) to reduce ad hoc branching.
- •Refactor architecture to match algebra boundaries.
- •Test the laws (property/model/metamorphic checks).
- •Iterate: if laws are hard to state or test, the algebra is likely wrong.
Minimal-algebra decision guide
- •Alternatives/variants → coproduct (tagged union)
- •Independent fields → product (record/struct)
- •Combine + identity → monoid
- •Combine, no identity → semigroup
- •Ordering/permissions → poset/lattice
- •Add+multiply structure → semiring
- •Structure-preserving map → functor
- •Effectful apply → applicative
- •Sequenced effects → monad
Testing expectations
- •Include law/property tests for the chosen algebra.
- •Prefer property-based checks when the repo already supports them.
- •If not, write minimal deterministic law checks in the existing test framework.
- •Don’t assume tooling exists; propose new dependencies only with user approval.
References
- •
references/addd-overview.md - •
references/addd-sources.md - •
references/structures-and-laws.md - •
references/testing-playbook.md - •
references/case-studies.md - •
references/examples-haskell.md - •
references/examples-go.md - •
references/examples-typescript.md
Scripts
- •
scripts/emit_law_test_stub.shprints illustrative law-test stubs for Haskell, Go, or TypeScript.