diff --git a/cl-stream.lisp b/cl-stream.lisp
index 3dbd9f5..dc3947e 100644
--- a/cl-stream.lisp
+++ b/cl-stream.lisp
@@ -245,22 +245,24 @@ Returns NIL if successful, or
(defmethod (setf stream-input-buffer) (value (stream buffered-input-stream))
(setf (slot-value stream 'input-buffer) value))
+(defgeneric stream-read-element-from-buffer (stream))
+
+(defmethod stream-read-element-from-buffer ((stream buffered-input-stream))
+ (let ((element (aref (stream-input-buffer stream)
+ (stream-input-index stream))))
+ (assert (typep element (stream-element-type stream)))
+ (incf (stream-input-index stream))
+ (values element nil)))
+
(defmethod read ((stream buffered-input-stream))
(check-if-open stream)
- (let ((buffer (stream-input-buffer stream)))
- (flet ((read-element ()
- (let ((element (aref buffer (stream-input-index stream))))
- (assert (typep element (stream-element-type stream)))
- (incf (stream-input-index stream))
- (values element nil))))
- (if (< (stream-input-index stream) (stream-input-length stream))
- (read-element)
- (case (stream-fill-input-buffer stream)
- ((nil) (read-element))
- ((:eof) (return-from read (values nil :eof)))
- ((:non-blocking) (return-from read
- (values nil :non-blocking)))
- (:otherwise (error 'stream-input-error :stream stream)))))))
+ (if (< (stream-input-index stream) (stream-input-length stream))
+ (stream-read-element-from-buffer stream)
+ (ecase (stream-fill-input-buffer stream)
+ ((nil) (stream-read-element-from-buffer stream))
+ ((:eof) (values nil :eof))
+ ((:non-blocking) (values nil :non-blocking))
+ (otherwise (error 'stream-input-error :stream stream)))))
(defmethod close :after ((stream buffered-input-stream))
(setf (stream-input-buffer stream) nil))
diff --git a/package.lisp b/package.lisp
index b5e7e62..e6612f9 100644
--- a/package.lisp
+++ b/package.lisp
@@ -69,6 +69,7 @@
#:stream-output-buffer-size
#:stream-output-index
#:stream-output-length
+ #:stream-read-element-from-buffer
#:stream-write-element-to-buffer
#:with-input-from-sequence
#:with-input-from-string