racket-matrix-2012/os2-event-relay.rkt

30 lines
834 B
Racket

#lang racket/base
;; Ground-event relay for os2.
(provide event-relay)
(require "os2.rkt")
(define event-relay
(transition 'no-state
(role (topic-publisher (cons (wild) (wild)) #:monitor? #t)
#:state state
#:topic t
#:on-presence (match t
[(topic 'subscriber (cons (? evt? e) _) #f)
(printf "SUBSCRIBED ~v~n" e) (flush-output)
(transition state
(at-meta-level
(role (topic-subscriber (cons e (wild)))
#:name t
#:state state
[msg
(printf "FIRED ~v -> ~v~n" e msg) (flush-output)
(transition state
(send-message msg))])))]
[_ state])
#:on-absence (match t
[(topic 'subscriber (cons (? evt? e) _) #f)
(printf "UNSUBSCRIBED ~v~n" e) (flush-output)
(transition state
(at-meta-level (delete-role t)))]))))