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

36 lines
1.1 KiB
Racket
Raw Normal View History

2016-01-16 19:32:04 +00:00
#lang prospect
;; Hello-worldish "bank account" example.
(struct account (balance) #:prefab)
(struct alter-balance-by (amount) #:prefab)
(spawn (lambda (e balance)
(match e
[(message (alter-balance-by amount))
(define new-balance (+ balance amount))
(transition new-balance
(patch-seq (retract (account balance))
(assert (account new-balance))))]
[_ #f]))
0
(patch-seq (assert (observe (alter-balance-by ?)))
2016-01-16 19:32:04 +00:00
(assert (account 0))))
(spawn (lambda (e s)
(match e
[(patch added removed)
(for [(balance (project-assertions added (account (?!))))]
2016-01-16 19:32:04 +00:00
(printf "Balance changed to ~a\n" balance))
#f]
[_ #f]))
(void)
(assert (observe (account ?))))
2016-01-16 19:32:04 +00:00
(spawn (lambda (e s)
2016-01-16 23:45:44 +00:00
(if (and (patch? e) (matcher-non-empty? (patch-added e)))
(quit (list (message (alter-balance-by +100))
(message (alter-balance-by -30))))
#f))
(void)
(assert (observe (observe (alter-balance-by ?)))))