;; Swap-Channels (define-record-type :swap-channel (really-make-swap-channel channel) swap-channel? (channel swap-channel-channel)) (define (make-swap-channel) (really-make-swap-channel (make-channel))) (define (swap-rv swap-channel message-out) (let ((channel (swap-channel-channel swap-channel))) (guard (lambda () (let ((in-channel (make-channel))) (choose (list (wrap (receive-rv channel) (lambda (pair) (let ((message-in (car pair)) (out-channel (cdr pair))) (send out-channel message-out) message-in))) (wrap (send-rv channel (cons message-out in-channel)) (lambda (ignore) (receive in-channel))))))))))