Heavily derivative of these excellent posts on Scott Wlaschin's blog:
- https://fsharpforfunandprofit.com/posts/designing-for-correctness/
- https://fsharpforfunandprofit.com/csharp/union-types-in-csharp.html
- create order
- add order item to order
- remove order item from order
- pay for order
- refund order
- complete order
- cannot modify paid order
- cannot pay for order with no items, or already paid order
- can only refund paid orders, which are not already refunded or completed
- can only complete paid orders, which are not refunded
- Always true:
- paid order must have items
- refunded order must be paid
- therefore: refunded order must have items
- completed order must be paid
- therefore: completed order must have items
- Never true:
- refunded order must not be completed
- therefore: completed order must not be refunded