From 15504cccab85094ba407edffadc981e53d0187eb Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Mon, 31 Oct 2016 17:36:59 -0400 Subject: [PATCH] timestate --- racket/syndicate/drivers/timestate.rkt | 21 +++++++++++++++++++ racket/syndicate/examples/actor/timestate.rkt | 15 +++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 racket/syndicate/drivers/timestate.rkt create mode 100644 racket/syndicate/examples/actor/timestate.rkt diff --git a/racket/syndicate/drivers/timestate.rkt b/racket/syndicate/drivers/timestate.rkt new file mode 100644 index 0000000..5447503 --- /dev/null +++ b/racket/syndicate/drivers/timestate.rkt @@ -0,0 +1,21 @@ +#lang syndicate/actor + +(provide (struct-out later-than) + stop-when-timeout) + +(require/activate syndicate/drivers/timer) + +(struct later-than (msecs) #:prefab) + +(actor #:name 'drivers/timestate + (during (observe (later-than $msecs)) + (define timer-id (gensym 'timestate)) + (field [expired? #f]) + (on-start (send! (set-timer timer-id msecs 'absolute))) + (on (message (timer-expired timer-id _)) (expired? #t)) + (assert #:when (expired?) (later-than msecs)))) + +(define-syntax-rule (stop-when-timeout relative-msecs body ...) + (let ((timer-id (gensym 'timeout))) + (on-start (send! (set-timer timer-id relative-msecs 'relative))) + (stop-when (message (timer-expired timer-id _)) body ...))) diff --git a/racket/syndicate/examples/actor/timestate.rkt b/racket/syndicate/examples/actor/timestate.rkt new file mode 100644 index 0000000..07f6f04 --- /dev/null +++ b/racket/syndicate/examples/actor/timestate.rkt @@ -0,0 +1,15 @@ +#lang syndicate/actor + +(require/activate syndicate/drivers/timestate) + +(actor #:name 'demo-timeout + (on-start (printf "Starting demo-timeout\n")) + (on-stop (printf "Stopping demo-timeout\n")) + (stop-when-timeout 3000 (printf "Three second timeout fired\n"))) + +(actor #:name 'demo-later-than + (on-start (printf "Starting demo-later-than\n")) + (on-stop (printf "Stopping demo-later-than\n")) + (field [deadline (+ (current-inexact-milliseconds) 5000)]) + (stop-when (asserted (later-than (deadline))) + (printf "Deadline expired\n")))