Event-relay driver.

This commit is contained in:
Tony Garnock-Jones 2013-04-11 19:07:29 -04:00
parent cd7da75504
commit a36e15be47
1 changed files with 33 additions and 0 deletions

View File

@ -0,0 +1,33 @@
#lang typed/racket/base
;; Ground-event relay.
(provide event-relay)
(require "../sugar-typed.rkt")
(require "../support/event.rkt")
(: event-relay : (All (ParentState) Symbol -> (Spawn ParentState)))
(define (event-relay self-id)
(spawn: #:debug-name `(event-relay ,self-id)
#:parent : ParentState
#:child : Void
(transition/no-state
(endpoint: : Void
#:publisher (cons ? ?) #:observer
#:conversation (cons (? evt? e) _)
#:on-presence (begin
(printf "SUBSCRIBED ~v~n" e)
(flush-output)
(at-meta-level
(endpoint: : Void
#:subscriber (cons e ?)
#:name `(event-relay ,self-id ,e)
[msg
(begin
(printf "FIRED ~v -> ~v~n" e msg)
(flush-output)
(send-message msg))])))
#:on-absence (begin
(printf "UNSUBSCRIBED ~v~n" e)
(flush-output)
(at-meta-level
(delete-endpoint `(event-relay ,self-id ,e))))))))