original commit: dfd42dcd44e18742ba38b87a480661093d33a1a3
This commit is contained in:
Matthew Flatt 2003-04-15 17:34:48 +00:00
parent 2cef4f59cd
commit a21012b763

65
collects/mzlib/cml.ss Normal file
View File

@ -0,0 +1,65 @@
(module cml mzscheme
(require (lib "contract.ss"))
(define (spawn thunk)
(thread/suspend-to-kill thunk))
(define (sync w)
(object-wait-multiple #f w))
(define (channel)
(make-channel))
(define (channel-recv-evt ch)
ch)
(define (channel-send-evt ch v)
(make-wrapped-waitable
(make-channel-put-waitable ch v)
void))
(define (choice-evt . l)
(apply waitables->waitable-set l))
(define (wrap-evt w proc)
(make-wrapped-waitable w proc))
(define (guard-evt proc)
(make-guard-waitable proc))
(define (nack-guard-evt proc)
(make-nack-guard-waitable proc))
(define (thread-done-evt th)
(thread-dead-waitable th))
(define (current-time)
(current-seconds))
(define (time-evt t)
(make-nack-guard-waitable
(lambda (nack)
(let ([s (make-semaphore)])
(thread-resume (thread/suspend-to-kill
(lambda ()
(sleep (max 0 (- t (current-seconds))))
(semaphore-post s)))
(current-thread))
(make-wrapped-waitable s void)))))
(provide/contract
(spawn ((-> any) . -> . thread?))
(sync (object-waitable? . -> . any))
(channel (-> channel?))
(channel-recv-evt (channel? . -> . object-waitable?))
(channel-send-evt (channel? any? . -> . object-waitable?))
(choice-evt (() (listof object-waitable?) . ->* . (object-waitable?)))
(wrap-evt (object-waitable? (any? . -> . any?) . -> . object-waitable?))
(guard-evt ((-> any?) . -> . object-waitable?))
(nack-guard-evt ((object-waitable? . -> . any?) . -> . object-waitable?))
(thread-done-evt (thread? . -> . object-waitable?))
(current-time (-> number?))
(time-evt (number? . -> . object-waitable?))))