syndicate-2017/racket/syndicate/examples/actor/example-partial-retraction.rkt

49 lines
1.7 KiB
Racket
Raw Normal View History

2016-07-10 16:33:16 +00:00
#lang syndicate/actor
2016-05-17 04:09:18 +00:00
;; Illustrates the response of asserted / retracted / during to
;; observation of assertions discarding some of their dimensions.
(struct ready (what) #:prefab)
(struct entry (key val) #:prefab)
(actor (react
2016-05-17 04:09:18 +00:00
(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))))
(actor (react
2016-05-17 04:15:52 +00:00
(assert (ready 'other-listener))
(during (entry $key _)
(log-info "(other-listener) key ~v asserted" key)
(on-stop (log-info "(other-listener) key ~v retracted" key))
2016-05-17 04:15:52 +00:00
(during (entry key $value)
(log-info "(other-listener) ~v ---> ~v" key value)
(on-stop (log-info "(other-listener) ~v -/-> ~v" key value))))))
2016-05-17 04:15:52 +00:00
2016-05-17 04:09:18 +00:00
(define (pause)
(log-info "pause")
(define token (gensym 'pause)) ;; FIXME:: If we use the same token every time, need epochs!
(until (asserted (ready token))
(assert (ready token))))
2016-05-17 04:09:18 +00:00
(actor (until (asserted (ready 'listener)))
2016-05-17 04:15:52 +00:00
(until (asserted (ready 'other-listener)))
2016-05-17 04:09:18 +00:00
(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))