#lang scheme
(define-struct failure (exn))
(define (channel-get-values channel)
(let ([result (channel-get channel)])
(if (failure? result) (raise-user-error "Channel couldn't get because" (failure-exn result))
(apply values result))))
(define (channel-put-values channel . values)
(channel-put channel values))
(define (channel-raise channel e)
(let ([f (make-failure e)])
(sync/timeout 3 (channel-put-evt channel f))))
(define (channel-putting channel proc)
(call-with-exception-handler
(λ (e) (channel-raise channel e) e)
(λ () (proc (λ values (channel-put channel values))))))
(provide (rename-out
(channel-get-values get)
(channel-put-values put)
(channel-raise raise)
(channel-putting putting)))