syndicate-2017/racket/syndicate/examples/bank-account-monolithic.rkt

25 lines
883 B
Racket

#lang syndicate/monolithic
;; Hello-worldish "bank account" example.
(struct account (balance) #:prefab)
(struct deposit (amount) #:prefab)
(define (manager e balance)
(match-event e
[(message (deposit amount))
(transition (+ balance amount)
(scn (assertion (account (+ balance amount)))))]))
(define (observer e _)
(when (scn? e) (for [(balance (project-assertions (scn-trie e) (account (?!))))]
(printf "Balance changed to ~a\n" balance))))
(define (updater e _)
(when (and (scn? e) (trie-non-empty? (scn-trie e)))
(quit (list (message (deposit +100))
(message (deposit -30))))))
(actor manager 0 (scn/union (assertion (observe (deposit ?))) (assertion (account 0))))
(actor observer (void) (scn (assertion (observe (account ?)))))
(actor updater (void) (scn (assertion (observe (observe (deposit ?))))))