From af150712e0f36917b42d1943339b994a8e709992 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Tue, 6 Mar 2018 17:35:40 +0000 Subject: [PATCH] example-memoized.rkt --- .../examples/actor/example-memoized.rkt | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 racket/syndicate/examples/actor/example-memoized.rkt diff --git a/racket/syndicate/examples/actor/example-memoized.rkt b/racket/syndicate/examples/actor/example-memoized.rkt new file mode 100644 index 0000000..67a6e1d --- /dev/null +++ b/racket/syndicate/examples/actor/example-memoized.rkt @@ -0,0 +1,32 @@ +#lang syndicate + +(require/activate syndicate/drivers/timestate) + +(assertion-struct memoized (req resp)) +(assertion-struct underlying (req resp)) + +(spawn (during (observe (underlying $req _)) + (on-start (printf "**** Computing underlying ~a\n" req)) + (on-stop (printf "**** Releasing underlying ~a\n" req)) + (assert (underlying req (+ req 1))))) + +(spawn (during (observe (memoized $req _)) + (on-start (printf "Outer memo entry for ~a created\n" req)) + (on-stop (printf "Outer memo entry for ~a released\n" req)) + (assert (observe (memoized req _))) ;; keep self alive + (stop-when-timeout 3000) + (on-start + (react (stop-when (asserted (underlying req $resp)) + (printf "Underlying response ~a for ~a received\n" resp req) + (react (on-start (printf "Memo entry for ~a => ~a created\n" req resp)) + (on-stop (printf "Memo entry for ~a => ~a released\n" req resp)) + (assert (memoized req resp)))))))) + +(spawn (stop-when (asserted (memoized 1 $n)) + (printf "First result for 1: ~a\n" n) + (sleep 1) + (react (stop-when (asserted (memoized 1 $m)) + (printf "Second result for 1: ~a\n" m) + (sleep 3) + (react (stop-when (asserted (memoized 1 $k)) + (printf "Third result for 1: ~a\n" k)))))))