I An order
TLC reached 13 states and 17 steps.
- Every drink being made, ready or handed over has been paid for.
PaidForEveryDrink - A refunded order has its money back.
RefundsGiveMoneyBack
---- MODULE Order ----
EXTENDS Naturals
VARIABLES order, paid, pearls, remakes
vars == <<order, paid, pearls, remakes>>
Init ==
/\ order = "in line"
/\ paid = FALSE
/\ pearls = "plenty"
/\ remakes = 0
YouOrder ==
/\ order = "in line"
/\ order' = "ordered"
/\ UNCHANGED <<paid, pearls, remakes>>
YouPay ==
/\ order = "ordered"
/\ order' = "paid"
/\ paid' = TRUE
/\ UNCHANGED <<pearls, remakes>>
PearlsRunOut ==
/\ pearls = "plenty"
/\ order \in {"in line", "ordered", "paid"}
/\ pearls' = "out"
/\ UNCHANGED <<order, paid, remakes>>
BaristaStarts ==
/\ order = "paid"
/\ pearls = "plenty"
/\ order' = "being made"
/\ UNCHANGED <<paid, pearls, remakes>>
MoneyBack ==
/\ order = "paid"
/\ pearls = "out"
/\ order' = "refunded"
/\ paid' = FALSE
/\ UNCHANGED <<pearls, remakes>>
NumberCalled ==
/\ order = "being made"
/\ order' = "ready"
/\ UNCHANGED <<paid, pearls, remakes>>
WrongDrink ==
/\ order = "ready"
/\ remakes < 1
/\ order' = "being made"
/\ remakes' = remakes + 1
/\ UNCHANGED <<paid, pearls>>
YouPickItUp ==
/\ order = "ready"
/\ order' = "in your hand"
/\ UNCHANGED <<paid, pearls, remakes>>
Done ==
/\ order \in {"in your hand", "refunded"}
/\ UNCHANGED vars
Next ==
\/ YouOrder \/ YouPay \/ PearlsRunOut \/ BaristaStarts \/ MoneyBack
\/ NumberCalled \/ WrongDrink \/ YouPickItUp \/ Done
Spec == Init /\ [][Next]_vars
TypeOK ==
/\ order \in {"in line", "ordered", "paid", "being made", "ready", "in your hand", "refunded"}
/\ paid \in BOOLEAN
/\ pearls \in {"plenty", "out"}
/\ remakes \in 0..1
PaidForEveryDrink == order \in {"being made", "ready", "in your hand"} => paid
RefundsGiveMoneyBack == order = "refunded" => ~paid
NoDrinkWithoutPearls == order = "being made" => pearls = "plenty" \/ remakes > 0
====export const title = "an order of boba";
export const state = (v) => v.order;
const STEPS = {
YouOrder: "you order",
YouPay: "you pay",
PearlsRunOut: "the pearls run out",
BaristaStarts: "the barista starts [if there are pearls]",
MoneyBack: "money back [if the pearls ran out]",
NumberCalled: "your number is called",
WrongDrink: "it's the wrong drink",
YouPickItUp: "you pick it up",
Done: "you drink it",
};
export const step = (action) => STEPS[action];---
title: "an order of boba"
config:
state:
rankSpacing: 26
nodeSpacing: 60
---
stateDiagram-v2
s0: in line
s1: ordered
s2: paid
s3: being made
s4: ready
s5: refunded
s6: in your hand
[*] --> s0
s0 --> s1: you order
s1 --> s2: you pay
s2 --> s3: the barista starts [if there are pearls]
s3 --> s4: your number is called
s2 --> s5: money back [if the pearls ran out]
s4 --> s3: it's the wrong drink
s4 --> s6: you pick it up