syndicate-2017/historical/syndicate-monolithic/examples/box-and-client.rkt

27 lines
981 B
Racket

#lang syndicate-monolithic
;; Simple mutable box and count-to-infinity box client.
(struct set-box (new-value) #:transparent)
(struct box-state (value) #:transparent)
(spawn (lambda (e current-value)
(match e
[(message (set-box new-value))
(log-info "box: taking on new-value ~v" new-value)
(transition new-value (scn/union (subscription (set-box ?))
(assertion (box-state new-value))))]
[_ #f]))
0
(scn/union (subscription (set-box ?))
(assertion (box-state 0))))
(spawn (lambda (e s)
(match e
[(scn assertions)
(transition s (for/list [(v (project-assertions assertions (box-state (?!))))]
(log-info "client: learned that box's value is now ~v" v)
(message (set-box (+ v 1)))))]
[_ #f]))
(void)
(scn (subscription (box-state ?))))