syndicate-2017/prospect/examples/bank-account.rkt

28 lines
941 B
Racket
Raw Normal View History

2016-01-16 19:32:04 +00:00
#lang prospect
;; Hello-worldish "bank account" example.
(struct account (balance) #:prefab)
2016-01-18 22:38:58 +00:00
(struct deposit (amount) #:prefab)
2016-01-16 19:32:04 +00:00
2016-01-18 22:38:58 +00:00
(define (manager e balance)
(match e
[(message (deposit amount))
(transition (+ balance amount) (patch-seq (retract (account balance))
(assert (account (+ balance amount)))))]
[_ #f]))
2016-01-16 19:32:04 +00:00
2016-01-18 22:38:58 +00:00
(define (observer e _)
(when (patch? e) (for [(balance (project-assertions (patch-added e) (account (?!))))]
(printf "Balance changed to ~a\n" balance)))
2016-01-18 22:38:58 +00:00
#f)
2016-01-16 19:32:04 +00:00
2016-01-18 22:38:58 +00:00
(define (updater e _)
2016-01-22 02:55:41 +00:00
(if (and (patch? e) (trie-non-empty? (patch-added e)))
2016-01-18 22:38:58 +00:00
(quit (list (message (deposit +100))
(message (deposit -30))))
#f))
(spawn manager 0 (patch-seq (assert (observe (deposit ?))) (assert (account 0))))
(spawn observer (void) (assert (observe (account ?))))
(spawn updater (void) (assert (observe (observe (deposit ?)))))