git clone 'https://github.com/fukamachi/circular-streams.git'
(defparameter *stream* (flex:make-in-memory-input-stream #(72 101 108 108 111))) (defparameter *circular-stream* (make-circular-input-stream *stream*)) (read-char *circular-stream*) ;=> #\H (read-char *circular-stream*) ;=> #\e (read-char *circular-stream*) ;=> #\l (read-char *circular-stream*) ;=> #\l (read-char *circular-stream*) ;=> #\o (read-char *circular-stream* nil :eof) ;=> :eof (let ((buf (make-array 5 :adjustable t :fill-pointer 5))) (read-sequence buf *circular-stream*) (flex:octets-to-string buf)) ;=> "Hello"
Circular-Streams allows you to read streams circularly by wrapping real streams. Once you reach end-of-file of a stream, it's file position will be reset to 0 and you're able to read it again.
Note this library can treat only octet streams which has a method
read-byte. This might be expanded in the future.
This library was originally written by Tomohiro Matsuyama as a part of Clack, Eitarow Fukamachi ported it with some improvements.
Class for circular input streams.
make-circular-input-stream is available to create an instance.
circular-input-stream and returns it. If
:buffer is specified, the instance uses it as an internal buffer. You need this to reuse
circular-input-stream without saving itself.
Creates a buffer array for
Copyright (c) 2011-2012 Tomohiro Matsuyama (firstname.lastname@example.org)
Copyright (c) 2012 Eitarow Fukamachi (email@example.com)
Licensed under the LLGPL License.