62 lines
1.8 KiB
Racket
62 lines
1.8 KiB
Racket
|
#lang racket/base
|
||
|
|
||
|
(require racket/port)
|
||
|
(require "os-big-bang.rkt")
|
||
|
|
||
|
(define display-driver-handler
|
||
|
(message-handlers w
|
||
|
[`(display ,message)
|
||
|
(transition w (send-meta-message (lambda ()
|
||
|
(display message)
|
||
|
(flush-output))))]))
|
||
|
|
||
|
(define read-line-driver-handler
|
||
|
(message-handlers w
|
||
|
[`(request ,reply-addr read-line)
|
||
|
(define sid `(read-line-transaction ,reply-addr))
|
||
|
(transition w
|
||
|
(subscribe sid
|
||
|
(meta-message-handler w
|
||
|
[((read-line-evt (current-input-port) 'any) => l)
|
||
|
(transition w
|
||
|
(unsubscribe sid)
|
||
|
(send-message `(reply ,reply-addr ,l)))])))]))
|
||
|
|
||
|
;; This should be part of racket
|
||
|
(define (time-evt msecs)
|
||
|
(wrap-evt (alarm-evt msecs) (lambda (_) (current-inexact-milliseconds))))
|
||
|
|
||
|
(define (tick-driver self-sid interval)
|
||
|
(let loop ((last-tick-time 0) (counter 0))
|
||
|
(subscribe self-sid
|
||
|
(meta-message-handler w
|
||
|
[((time-evt (+ last-tick-time interval)) => now)
|
||
|
(transition w
|
||
|
(unsubscribe self-sid)
|
||
|
(send-message `(tick ,counter ,now))
|
||
|
(loop now (+ counter 1)))]))))
|
||
|
|
||
|
(os-big-bang 'none
|
||
|
(subscribe 'display-driver display-driver-handler)
|
||
|
(subscribe 'read-line-driver read-line-driver-handler)
|
||
|
(tick-driver 'ticker 1000)
|
||
|
(send-message `(display "Hello! Enter your name:\n"))
|
||
|
(send-message `(request read-name read-line))
|
||
|
(subscribe 'ticker-handler
|
||
|
(message-handlers w
|
||
|
[`(tick ,counter ,_)
|
||
|
(transition w
|
||
|
(send-message
|
||
|
`(display ,(string-append "TICK "
|
||
|
(number->string counter)
|
||
|
"\n"))))]))
|
||
|
(subscribe 'greet
|
||
|
(message-handlers w
|
||
|
[`(reply read-name ,name)
|
||
|
(transition w
|
||
|
(send-message `(display "Hello, "))
|
||
|
(send-message `(display ,name))
|
||
|
(send-message `(display "!\n"))
|
||
|
(unsubscribe 'ticker)
|
||
|
)])))
|