syndicate-2017/racket/syndicate/examples/actor/simple-dns.rkt

34 lines
1.3 KiB
Racket

#lang syndicate
;; Sketch of a DNS intra-program protocol
(assertion-struct dns-entry (name address))
(require/activate syndicate/drivers/timestate)
(spawn #:name 'server
(during (observe (dns-entry "localhost" _))
(on-start (printf "asserting localhost record\n"))
(on-stop (printf "retracting localhost record\n"))
(assert (dns-entry "localhost" "127.0.0.1"))))
(spawn #:name 'cache
(on (asserted (observe (dns-entry $name _)))
(define deadline (+ (current-inexact-milliseconds) 2000))
(react (stop-when (asserted (later-than deadline)))
(on-start (printf "caching ~a\n" name))
(on-stop (printf "uncaching ~a\n" name))
(assert (observe (dns-entry name _))))))
(spawn #:name 'main
(stop-when (asserted (dns-entry "localhost" $addr))
(printf "localhost is ~a\n" addr)
(sleep 1)
(react (stop-when (asserted (dns-entry "localhost" $addr))
(printf "localhost is still ~a\n" addr)
(sleep 2)
(react (stop-when (asserted (dns-entry "localhost" $addr))
(printf "localhost is STILL ~a\n" addr)))))))
(module+ main
(file-stream-buffer-mode (current-output-port) 'line))