diff --git a/collects/mzlib/port.rkt b/collects/mzlib/port.rkt index a703db5..8ddff2b 100644 --- a/collects/mzlib/port.rkt +++ b/collects/mzlib/port.rkt @@ -478,6 +478,35 @@ count-lines!-proc pos))) +(define filter-read-input-port + (lambda (p wrap-read wrap-peek [close? #t]) + (make-input-port + (object-name p) + (lambda (s) + (let ([v (read-bytes-avail!* s p)]) + (wrap-read + s + (if (eq? v 0) (wrap-evt p (lambda (x) 0)) v)))) + (lambda (s skip evt) + (let ([v (peek-bytes-avail!* s skip evt p)]) + (wrap-peek + s skip evt + (if (eq? v 0) + (choice-evt + (wrap-evt p (lambda (x) 0)) + (if evt (wrap-evt evt (lambda (x) #f)) never-evt)) + v)))) + (lambda () + (when close? (close-input-port p))) + (and (port-provides-progress-evts? p) + (lambda () (port-progress-evt p))) + (and (port-provides-progress-evts? p) + (lambda (n evt target-evt) (port-commit-peeked n evt target-evt p))) + (lambda () (port-next-location p)) + (lambda () (port-count-lines! p)) + (let-values ([(line col pos) (port-next-location p)]) + (or pos (file-position p)))))) + ;; Not kill-safe. (define make-pipe-with-specials ;; This implementation of pipes is almost CML-style, with a manager thread @@ -1732,6 +1761,7 @@ peeking-input-port relocate-input-port transplant-input-port + filter-read-input-port special-filter-input-port relocate-output-port transplant-output-port