diff --git a/collects/mzlib/port.ss b/collects/mzlib/port.ss index 588cc50..63f751e 100644 --- a/collects/mzlib/port.ss +++ b/collects/mzlib/port.ss @@ -7,6 +7,7 @@ (provide open-output-nowhere make-pipe-with-specials make-input-port/read-to-peek + peeking-input-port merge-input copy-port input-port-append @@ -449,6 +450,22 @@ (port-progress-evt peeked-r)) commit-it)) + (define peeking-input-port + (opt-lambda (orig-in [name (object-name orig-in)] [delta 0]) + (make-input-port/read-to-peek + name + (lambda (s) + (let ([r (peek-bytes-avail!* s delta #f orig-in)]) + (set! delta (+ delta (cond + [(number? r) r] + [else 1]))) + (if (eq? r 0) + (handle-evt orig-in (lambda (v) 0)) + r))) + (lambda (s skip default) + (peek-bytes-avail!* s (+ delta skip) #f orig-in)) + void))) + ;; Not kill-safe. (define make-pipe-with-specials ;; This implementation of pipes is almost CML-style, with a manager thread