typed-racket/typed-racket-test/succeed/threads-and-async-channels.rkt
2014-12-16 10:07:25 -05:00

77 lines
1.8 KiB
Racket

#lang typed/racket
(require typed/racket/async-channel)
;; same as threads-and-channels.rkt, but with async-channels
(: chan (Async-Channelof Symbol))
(define chan (make-async-channel))
(define (reader)
(thread
(lambda ()
(let loop : True ((i : Integer 10))
(if (= i 0)
#t
(begin (async-channel-get chan)
(loop (- i 1))))))))
(: writer (Symbol -> Thread))
(define (writer x)
(thread
(lambda ()
(async-channel-put chan x)
(async-channel-put chan x))))
(reader)
(writer 'a)
(writer 'b)
(writer 'c)
(writer 'd)
(writer 'e)
(define-type JumpingChannel (Rec JumpingChannel (Async-Channelof (Pair JumpingChannel Symbol))))
(: jump-chan JumpingChannel)
(define jump-chan (make-async-channel))
(define (jumping-reader)
(thread
(lambda ()
(let loop : True ((i : Integer 3)
(c : JumpingChannel jump-chan))
(if (= i 0)
#t
(loop (- i 1)
(car (async-channel-get c))))))))
(jumping-reader)
(let ((c2 : JumpingChannel (make-async-channel)))
(async-channel-put jump-chan (cons c2 'a))
(let ((c3 : JumpingChannel (make-async-channel)))
(async-channel-put c2 (cons c3 'b))
(let ((c4 : JumpingChannel (make-async-channel)))
(async-channel-put c3 (cons c4 'c)))))
(: tc (Thread-Cellof Integer))
(define tc (make-thread-cell 0))
(thread-cell-set! tc 1)
(thread-wait (thread (lambda ()
(displayln (thread-cell-ref tc))
(thread-cell-set! tc 2)
(displayln (thread-cell-ref tc)))))
(thread-cell-ref tc)
(define blocked-thread
(thread (lambda ()
(async-channel-get ((inst make-async-channel 'unused))))))
(thread-suspend blocked-thread)
(kill-thread blocked-thread)