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

49 lines
1.5 KiB
Racket

#lang typed/syndicate
(define-type-alias ds-type
(U (Tuple String Int)
(Observe (Tuple String ))
(Observe (Observe (Tuple String )))))
(dataspace ds-type
(spawn ds-type
(facet _
(fields [balance Int 0])
(assert (tuple "balance" (ref balance)))
(on (asserted (tuple "deposit" (bind amount Int)))
(set! balance (+ (ref balance) amount)))))
(spawn ds-type
(facet _
(fields)
(on (asserted (tuple "balance" (bind amount Int)))
(displayln amount))))
(spawn ds-type
(facet _
(fields)
(on (asserted (observe (tuple "deposit" discard)))
(facet _
(fields)
(assert (tuple "deposit" 100))
(assert (tuple "deposit" -30)))))))
#|
;; Hello-worldish "bank account" example.
(struct account (balance) #:prefab)
(struct deposit (amount) #:prefab)
(spawn (field [balance 0])
(assert (account (balance)))
(on (message (deposit $amount))
(balance (+ (balance) amount))))
(spawn (on (asserted (account $balance))
(printf "Balance changed to ~a\n" balance)))
(spawn* (until (asserted (observe (deposit _))))
(send! (deposit +100))
(send! (deposit -30)))
|#