syndicate-2017/racket/prospect/examples/endpoint-example.rkt

70 lines
1.9 KiB
Racket
Raw Normal View History

2015-05-11 22:25:38 +00:00
#lang prospect
(require "../endpoint.rkt")
(require "../drivers/timer.rkt")
(spawn-timer-driver)
(define ((log-it eid) e u)
(log-info "endpoint ~a state ~a: ~v" eid u e)
2015-05-11 22:25:38 +00:00
(and e (transition (+ u 1)
(if (equal? e (message 2))
(if (equal? eid 0)
(list (unsub 2) (sub 5) (as-endpoint 1 (delete-endpoint)))
2015-05-11 22:25:38 +00:00
(list (unsub 2) (sub 5)))
'()))))
(spawn (lambda (e u)
(when (message? e) (log-info "general: ~v" e))
#f)
(void)
(patch-seq (sub ?)
(unsub (observe ?))
(unsub (at-meta ?))))
2015-05-11 22:25:38 +00:00
(spawn-endpoint-group 0
(add-endpoint
(lambda (eid state)
(values (log-it eid)
2015-05-11 22:25:38 +00:00
(transition state
(list (sub 1)
(sub 2))))))
(add-endpoint
(lambda (eid state)
(values (log-it eid)
2015-05-11 22:25:38 +00:00
(transition state
(list (sub 3)
(sub 2)))))))
(define (after msec thunk)
(define id (gensym 'after))
(if (zero? msec)
(thunk)
(list
(spawn (lambda (e s) (and (message? e) (quit (thunk))))
(void)
(sub (timer-expired id ?)))
(message (set-timer id msec 'relative)))))
(after 100
(lambda ()
(list
(message 0)
(message 1)
(message 2)
(message 3)
(message 4)
(message 5)
(message 6))))
(after 100
(lambda ()
(list
(message 0)
(message 1)
(message 2)
(message 3)
(message 4)
(message 5)
(message 6))))