diff --git a/racket/syndicate/examples/actor/example-partial-retraction.rkt b/racket/syndicate/examples/actor/example-partial-retraction.rkt new file mode 100644 index 0000000..68ad166 --- /dev/null +++ b/racket/syndicate/examples/actor/example-partial-retraction.rkt @@ -0,0 +1,39 @@ +#lang syndicate +;; Illustrates the response of asserted / retracted / during to +;; observation of assertions discarding some of their dimensions. + +(require syndicate/actor) + +(struct ready (what) #:prefab) +(struct entry (key val) #:prefab) + +(actor (forever + (assert (ready 'listener)) + (on (asserted (entry $key _)) + (log-info "key ~v asserted" key) + (until (retracted (entry key _)) + (on (asserted (entry key $value)) + (log-info "add binding: ~v -> ~v" key value)) + (on (retracted (entry key $value)) + (log-info "del binding: ~v -> ~v" key value))) + (log-info "key ~v retracted" key)))) + +(define (pause) + (log-info "pause") + (until (asserted (ready 'pause)) + (assert (ready 'pause)))) + +(actor (until (asserted (ready 'listener))) + (assert! (entry 'a 1)) + (assert! (entry 'a 2)) + (assert! (entry 'b 3)) + (assert! (entry 'c 33)) + (assert! (entry 'a 4)) + (assert! (entry 'a 5)) + (pause) + (retract! (entry 'a 2)) + (retract! (entry 'c 33)) + (assert! (entry 'a 9)) + (pause) + (retract! (entry 'a ?)) + (pause))