32 lines
1017 B
Racket
32 lines
1017 B
Racket
#lang syndicate
|
|
|
|
(require/activate syndicate/drivers/timestate)
|
|
|
|
(assertion-struct active ())
|
|
(message-struct toggle ())
|
|
(message-struct stdout-message (body))
|
|
|
|
(spawn #:name 'printer
|
|
(on (message (stdout-message $body))
|
|
(displayln body)))
|
|
|
|
(spawn* #:name 'flip-flop
|
|
(define (active-state)
|
|
(react (assert (active))
|
|
(stop-when (message (toggle))
|
|
(inactive-state))))
|
|
(define (inactive-state)
|
|
(react (stop-when (message (toggle))
|
|
(active-state))))
|
|
(inactive-state))
|
|
|
|
(spawn #:name 'monitor-flip-flop
|
|
(on (asserted (active)) (send! (stdout-message "Flip-flop is active")))
|
|
(on (retracted (active)) (send! (stdout-message "Flip-flop is inactive"))))
|
|
|
|
(spawn #:name 'periodic-toggle
|
|
(field [next-toggle-time (current-inexact-milliseconds)])
|
|
(on (asserted (later-than (next-toggle-time)))
|
|
(send! (toggle))
|
|
(next-toggle-time (+ (next-toggle-time) 1000))))
|