37 lines
963 B
Racket
37 lines
963 B
Racket
#lang typed/syndicate/roles
|
|
|
|
;; Expected Output
|
|
;; pong: 8339
|
|
|
|
(message-struct ping : Ping (v))
|
|
(message-struct pong : Pong (v))
|
|
|
|
(define-type-alias ds-type
|
|
(U (Message (Ping Int))
|
|
(Message (Pong Int))
|
|
(Observe (Ping ★/t))
|
|
(Observe (Pong ★/t))
|
|
(Observe (Observe (Ping ★/t)))))
|
|
|
|
(run-ground-dataspace ds-type
|
|
(spawn ds-type
|
|
(lift+define-role ponger
|
|
(start-facet echo
|
|
(on (message (ping $v))
|
|
(send! (pong v))))))
|
|
(spawn ds-type
|
|
(lift+define-role pinger
|
|
(start-facet serve
|
|
(on (asserted (observe (ping _)))
|
|
(send! (ping 8339)))
|
|
(on (message (pong $x))
|
|
(printf "pong: ~v\n" x))))))
|
|
|
|
(module+ test
|
|
(verify-actors (And (Eventually (M (Ping Int)))
|
|
(Eventually (M (Pong Int)))
|
|
(Always (Implies (M (Ping Int))
|
|
(Eventually (M (Pong Int))))))
|
|
pinger
|
|
ponger))
|