From f1c164616321edf22f20f3cff255431e8ab94fb9 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sat, 16 Jan 2016 14:32:04 -0500 Subject: [PATCH] Bank account example --- prospect/examples/actor/bank-account.rkt | 22 +++++++++++++++++ prospect/examples/bank-account.rkt | 30 ++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 prospect/examples/actor/bank-account.rkt create mode 100644 prospect/examples/bank-account.rkt diff --git a/prospect/examples/actor/bank-account.rkt b/prospect/examples/actor/bank-account.rkt new file mode 100644 index 0000000..1a27c1e --- /dev/null +++ b/prospect/examples/actor/bank-account.rkt @@ -0,0 +1,22 @@ +#lang prospect +;; Hello-worldish "bank account" example. + +(require prospect/actor) + +(struct account (balance) #:prefab) +(struct alter-balance-by (amount) #:prefab) + +(actor-body->spawn-action + (lambda () + (actor (forever #:collect [(balance 0)] + (assert (account balance)) + (on (message (alter-balance-by $amount)) + (+ balance amount)))) + + (actor (forever (on (asserted (account $balance)) + (printf "Balance changed to ~a\n" balance)))) + + (until (asserted (observe (alter-balance-by _)))) + (send! (alter-balance-by +100)) + (send! (alter-balance-by -30)) + )) diff --git a/prospect/examples/bank-account.rkt b/prospect/examples/bank-account.rkt new file mode 100644 index 0000000..74d8bf8 --- /dev/null +++ b/prospect/examples/bank-account.rkt @@ -0,0 +1,30 @@ +#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 (sub (alter-balance-by ?)) + (assert (account 0)))) + +(spawn (lambda (e s) + (match e + [(patch added removed) + (for [(balance (matcher-project/set/single added (compile-projection (account (?!)))))] + (printf "Balance changed to ~a\n" balance)) + #f] + [_ #f])) + (void) + (sub (account ?))) + +(message (alter-balance-by +100)) +(message (alter-balance-by -30))