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

74 lines
1.6 KiB
Racket

#lang typed/racket
(: chan (Channelof Symbol))
(define chan (make-channel))
(define (reader)
(thread
(lambda ()
(let: loop : True ((i : Integer 10))
(if (= i 0)
#t
(begin (channel-get chan)
(loop (- i 1))))))))
(: writer (Symbol -> Thread))
(define (writer x)
(thread
(lambda ()
(channel-put chan x)
(channel-put chan x))))
(reader)
(writer 'a)
(writer 'b)
(writer 'c)
(writer 'd)
(writer 'e)
(define-type JumpingChannel (Rec JumpingChannel (Channelof (Pair JumpingChannel Symbol))))
(: jump-chan JumpingChannel)
(define jump-chan (make-channel))
(define (jumping-reader)
(thread
(lambda ()
(let: loop : True ((i : Integer 3)
(c : JumpingChannel jump-chan))
(if (= i 0)
#t
(loop (- i 1)
(car (channel-get c))))))))
(jumping-reader)
(let: ((c2 : JumpingChannel (make-channel)))
(channel-put jump-chan (cons c2 'a))
(let: ((c3 : JumpingChannel (make-channel)))
(channel-put c2 (cons c3 'b))
(let: ((c4 : JumpingChannel (make-channel)))
(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 ()
(channel-get ((inst make-channel 'unused))))))
(thread-suspend blocked-thread)
(kill-thread blocked-thread)