Appendix B

The Complete Capstone

Chapter 15 walked the running system in fragments. Here it is whole, in one listing — every region in the order it was built, so the seams and the membrane are visible on one page.

This appendix collects the running example into a single coherent program: a tightly-modelled order core, an open pricing engine, a contract membrane between them, fulfillment routing by unification and search, and a thin imperative shell. It is organized bottom-up — leaf types first, orchestration last — so each section depends only on the ones above it.

To keep the listing about the architecture rather than about currency arithmetic and string parsing, two things at the very edges are taken as given, with the exact interface the rest of the code relies on. Everything else is complete.

B.1 Assumed Leaf Types and Boundary Parser

The primitive value types are treated as a small library. Money is an amount with a currency, supporting +, -, the comparisons, a currency-agnostic Money.zero, and two domain operations used by pricing: less_percent(pct) and times(n). Sku, Email_Address, Tracking_Id, and Instant are opaque identifiers and timestamps.

-- Assumed value types (a small supporting library):
--   Money           : + - = < <= > >= ; .currency: String ; Money.zero
--                     less_percent(pct: Integer): Money ; times(n: Integer): Money
--   Sku, Email_Address, Tracking_Id, Instant : opaque
--
-- Assumed boundary parser (Chapter 4), built from field parsers like parse_quantity:
--   parse_order(request: Order_Request): Result[Draft, String]
--     -- turns an untrusted request into a validated Draft, or an Err with a reason

B.2 The Constrained Core (Chapters 3–5)

A Quantity cannot be non-positive; a Line_Item pairs a SKU with a quantity and a unit price; an Order is exactly one of three shapes. Placed's invariant is the membrane form from Chapter 15 — a non-negative total in a well-formed order — not the pre-pricing total = sum simplification of Chapter 3.

-- A Quantity is an Integer that is known to be positive (Chapter 3).
declare type Quantity = Integer where n: n > 0

class Line_Item
  create make(s: Sku, q: Quantity, unit: Money) do sku := s  quantity := q  unit_price := unit end
  feature
    sku: Sku
    quantity: Quantity
    unit_price: Money
    subtotal(): Money do result := unit_price.times(quantity) end
end

function sum_of(items: Array[Line_Item]): Money
  do
    result := Money.zero
    across items as it do
      result := result + it.subtotal
    end
  end

sealed deferred class Order
end

class Draft
  inherit Order
  create make(xs: Array[Line_Item], ccy: String, floor: Money,
              email: Email_Address, dest: String)
    do items := xs  currency := ccy  floor_price := floor
       customer_email := email  zone := dest end
  feature
    items: Array[Line_Item]
    currency: String
    floor_price: Money
    customer_email: Email_Address
    zone: String
end

class Placed
  inherit Order
  create make(xs: Array[Line_Item], t: Money, email: Email_Address, dest: String)
    require not_empty: xs.length > 0
    do items := xs  total := t  customer_email := email  zone := dest end
  feature
    items: Array[Line_Item]
    total: Money
    customer_email: Email_Address
    zone: String
  invariant
    not_empty:     items.length > 0
    non_negative:  total >= Money.zero
end

class Shipped
  inherit Order
  create make(xs: Array[Line_Item], t: Tracking_Id) do items := xs  tracking := t end
  feature
    items: Array[Line_Item]
    tracking: Tracking_Id
end

-- The one total transition into shipment: you cannot ship what was never placed.
function ship(p: Placed, t: Tracking_Id): Shipped
  do
    result := create Shipped.make(p.items, t)
  ensure
    items_preserved: result.items = p.items
  end

B.3 Result (Chapter 4)

intern data/Result

-- Result[T, E] is one of:
--   Ok(value: T)    -- success, holding a value of type T
--   Err(error: E)   -- failure, holding an error of type E
-- Throughout the capstone the error type E is String.

B.4 The Open Pricing Edge (Chapters 7 & 10)

Pricing is a small open language of expressions evaluated against a Draft, with conditions drawn from a specification algebra. Both interfaces are deferred and unsealed, so new terms and new conditions are added without editing anything.

-- Specifications: an open algebra of conditions on a draft (Chapter 7).
deferred class Spec[T]
  feature holds(item: T): Boolean do end
end

class Over_Amount inherit Spec[Draft]
  create make(m: Money) do threshold := m end
  feature
    threshold: Money
    holds(d: Draft): Boolean do result := sum_of(d.items) >= threshold end
end

-- Pricing expressions: an open language, evaluated to a Money (Chapter 10).
deferred class Price_Expr
  feature eval(d: Draft): Money do end
end

class Base inherit Price_Expr
  create make() do end
  feature eval(d: Draft): Money do result := sum_of(d.items) end
end

class Percent_Off inherit Price_Expr
  create make(pct: Integer, inner: Price_Expr) do percent := pct  base := inner end
  feature
    percent: Integer
    base: Price_Expr
    eval(d: Draft): Money
      require valid_percent: percent >= 0 and percent <= 100
      do result := base.eval(d).less_percent(percent)
      ensure no_increase: result <= base.eval(d)
      end
  end

class When inherit Price_Expr
  create make(s: Spec[Draft], t: Price_Expr, e: Price_Expr)
    do condition := s  yes := t  no := e end
  feature
    condition: Spec[Draft]
    yes: Price_Expr
    no: Price_Expr
    eval(d: Draft): Money
      do
        if condition.holds(d) then result := yes.eval(d)
        else result := no.eval(d) end
      end
end

class Floored inherit Price_Expr
  create make(inner: Price_Expr) do base := inner end
  feature
    base: Price_Expr
    eval(d: Draft): Money
      do
        let p: Money := base.eval(d)
        if p < d.floor_price then result := d.floor_price else result := p end
      ensure respects_floor: result >= d.floor_price
      end
end

B.5 The Membrane (Chapters 2, 9, 15)

The one gate through which every price, from any rule that will ever exist, must pass to become part of an order. Written from the core's side; it states the terms and admits only what meets them.

function admit_quote(draft: Draft, quote: Money): Result[Placed, String]
  require
    same_currency: quote.currency = draft.currency
  do
    if quote < Money.zero then
      result := create Err[Placed, String].make("quote is negative")
    elseif quote < draft.floor_price then
      result := create Err[Placed, String].make("quote below floor")
    else
      -- on success, Placed's own invariant guarantees a consistent order
      result := create Ok[Placed, String].make(
        create Placed.make(draft.items, quote, draft.customer_email, draft.zone))
    end
  end

B.6 Effects as Data (Chapter 6)

union Effect
  Charge_Payment(amount: Money)
  Reserve_Stock(warehouse: String, items: Array[Line_Item])
  Send_Confirmation(recipient: Email_Address)
  Record_Order(order: Placed)
end

class Placement
  feature
    order: Placed
    effects: Array[Effect]
  create make(o: Placed, fx: Array[Effect]) do order := o  effects := fx end
end

B.7 Fulfillment by Unification and Search (Chapter 13)

Terms are a closed structure with open unknowns; unification finds the substitution that makes two terms agree; the search tries each ground route fact against the order's query and keeps the first that satisfies the domain.

union Term
  Var(name: String)
  Atom(value: String)
  Compound(functor: String, args: Array[Term])
end

class Substitution
  create make() do bindings := {} end
  feature
    bindings: Map[String, Term]

    bind(vname: String, t: Term): Substitution
      do bindings.put(vname, t)  result := this end

    resolve(t: Term): Term
      do
        match t of
          when Var(name) then
            if bindings.contains_key(name) then result := resolve(bindings.get(name))
            else result := t end
          else
            result := t
        end
      end
end

function unify(a: Term, b: Term, s: Substitution): Result[Substitution, String]
  do
    let x: Term := s.resolve(a)
    let y: Term := s.resolve(b)
    match x of
      when Var(name) then result := create Ok[Substitution, String].make(s.bind(name, y))
      when Atom as ax then result := unify_atom(ax, y, s)
      when Compound as cx then result := unify_compound(cx, y, s)
    end
  end

function unify_atom(ax: Atom, y: Term, s: Substitution): Result[Substitution, String]
  do
    match y of
      when Var(name) then result := create Ok[Substitution, String].make(s.bind(name, ax))
      when Atom(value: v) if v = ax.value then result := create Ok[Substitution, String].make(s)
      when Atom(value: v) then result := create Err[Substitution, String].make("clash: " + ax.value + " vs " + v)
      when Compound as c then result := create Err[Substitution, String].make("atom vs structure")
    end
  end

function unify_compound(cx: Compound, y: Term, s: Substitution): Result[Substitution, String]
  do
    match y of
      when Var(name) then result := create Ok[Substitution, String].make(s.bind(name, cx))
      when Atom as a then result := create Err[Substitution, String].make("structure vs atom")
      when Compound as cy then
        if cx.functor = cy.functor and cx.args.length = cy.args.length then
          result := unify_args(cx.args, cy.args, s, 0)
        else
          result := create Err[Substitution, String].make("functor / arity mismatch")
        end
    end
  end

function unify_args(xs: Array[Term], ys: Array[Term], s: Substitution, i: Integer): Result[Substitution, String]
  do
    if i >= xs.length then
      result := create Ok[Substitution, String].make(s)
    else
      match unify(xs.get(i), ys.get(i), s) of
        when Ok as ok then result := unify_args(xs, ys, ok.value, i + 1)
        when Err as e then result := create Err[Substitution, String].make(e.error)
      end
    end
  end

-- The order's routing query: known zone, unknown warehouse/carrier/cost.
function routing_query(o: Placed): Term
  do
    let args: Array[Term] := []
    args.add(create Atom.make(o.zone))
    args.add(create Var.make("Warehouse"))
    args.add(create Var.make("Carrier"))
    args.add(create Var.make("Cost"))
    result := create Compound.make("route", args)
  end

-- A domain guardrail on a committed solution (a real one checks stock and deadline).
function satisfies_constraints(s: Substitution): Boolean
  do result := s.bindings.contains_key("Warehouse") end

function warehouse_of(s: Substitution): String
  do
    match s.resolve(create Var.make("Warehouse")) of
      when Atom as a then result := a.value
      else result := "unknown"
    end
  end

-- Try each route fact; the first whose bindings satisfy every constraint wins.
function route(query: Term, routes: Array[Term]): Result[Substitution, String]
  do
    from
      let i: Integer := 0
      let found: Boolean := false
      result := create Err[Substitution, String].make("no eligible route")
    invariant
      in_range: 0 <= i and i <= routes.length
    variant
      routes.length - i
    until
      i >= routes.length or found
    do
      match unify(query, routes.get(i), create Substitution.make()) of
        when Ok as s then
          if satisfies_constraints(s.value) then
            result := create Ok[Substitution, String].make(s.value)
            found := true
          end
        when Err as e then
          -- structural mismatch: backtrack, try the next route
      end
      i := i + 1
    end
  end

B.8 The Orchestration (Chapter 15)

One pure function threads a request through every region: parse, price, admit, route, and decide the effects. It performs nothing.

function place_order(request: Order_Request, rule: Price_Expr,
                     routes: Array[Term], now: Instant): Result[Placement, String]
  do
    match parse_order(request) of                        -- 1. boundary (Ch 4)
      when Err as bad then
        result := create Err[Placement, String].make(bad.error)
      when Ok as parsed then
        let draft: Draft := parsed.value
        let quote: Money := rule.eval(draft)              -- 2. open edge (Ch 10)
        match admit_quote(draft, quote) of                -- 3. membrane (Ch 2, 9)
          when Err as rejected then
            result := create Err[Placement, String].make(rejected.error)
          when Ok as ok then
            result := plan_fulfillment(ok.value, routes, now)   -- 4. core decides
        end
    end
  end

function plan_fulfillment(placed: Placed, routes: Array[Term],
                          now: Instant): Result[Placement, String]
  do
    match route(routing_query(placed), routes) of         -- 4a. routing (Ch 13)
      when Err as e then
        result := create Err[Placement, String].make("unfulfillable: " + e.error)
      when Ok as sol then
        let fx: Array[Effect] := []                        -- 4b. effects as data (Ch 6)
        fx.add(create Charge_Payment.make(placed.total))
        fx.add(create Reserve_Stock.make(warehouse_of(sol.value), placed.items))
        fx.add(create Send_Confirmation.make(placed.customer_email))
        fx.add(create Record_Order.make(placed))
        result := create Ok[Placement, String].make(create Placement.make(placed, fx))
    end
  end

B.9 The Imperative Shell (Chapters 6 & 8)

The only region that touches the world: it calls the pure core, then performs the returned effects. A real deployment wraps this in the logging and metrics layers of Chapter 8; the effect loop itself is this small.

perform(e: Effect, gateway: Payment_Gateway, mailer: Mailer,
        store: Order_Store, warehouse: Warehouse_Api)
  do
    match e of
      when Charge_Payment as c then gateway.charge(c.amount)
      when Reserve_Stock as r then warehouse.reserve(r.warehouse, r.items)
      when Send_Confirmation as s then mailer.send(s.recipient)
      when Record_Order as rec then store.save(rec.order)
    end
  end

-- Drive one request: decide purely, then perform.
function handle_request(request: Order_Request, rule: Price_Expr, routes: Array[Term],
                        now: Instant, gateway: Payment_Gateway, mailer: Mailer,
                        store: Order_Store, warehouse: Warehouse_Api): Result[Placed, String]
  do
    match place_order(request, rule, routes, now) of
      when Err as e then
        result := create Err[Placed, String].make(e.error)
      when Ok as placement then
        across placement.value.effects as fx do
          perform(fx, gateway, mailer, store, warehouse)
        end
        result := create Ok[Placed, String].make(placement.value.order)
    end
  end

B.10 Putting It Together

Finally, the open edge configured as data — a pricing rule and a table of routes — and one request driven through the whole system. Note that every extension point is a value: a new promotion is a new Price_Expr, a new route is a new fact appended to routes, and neither touches the core or the membrane.

-- A pricing rule, as data: 10% off large orders, never below the floor.
let rule: Price_Expr :=
  create Floored.make(
    create When.make(
      create Over_Amount.make(big_order_threshold),
      create Percent_Off.make(10, create Base.make()),
      create Base.make()))

-- Route facts, as data: (zone, warehouse, carrier, cost).
function route_fact(zone: String, wh: String, carrier: String, cost: String): Term
  do
    let args: Array[Term] := []
    args.add(create Atom.make(zone))
    args.add(create Atom.make(wh))
    args.add(create Atom.make(carrier))
    args.add(create Atom.make(cost))
    result := create Compound.make("route", args)
  end

let routes: Array[Term] := []
-- routes.add(route_fact("zone-a", "wh-1", "ups", "500"))
-- routes.add(route_fact("zone-b", "wh-2", "fedex", "650"))

let outcome: Result[Placed, String] :=
  handle_request(incoming, rule, routes, now,
                 gateway, mailer, store, warehouse)

That is the whole system: a core the compiler proves correct, an edge that grows by adding data, and a single contract holding the two apart and together. Constraint and flexibility, one codebase, no contradiction.