io.streams.peek: read-unsafe protocol

db4
Joe Groff 2011-10-13 14:09:13 -07:00
parent a9ab3db167
commit 6828eeb27e
1 changed files with 14 additions and 11 deletions

View File

@ -6,6 +6,7 @@ vectors ;
IN: io.streams.peek IN: io.streams.peek
TUPLE: peek-stream stream peeked ; TUPLE: peek-stream stream peeked ;
INSTANCE: peek-stream noncopying-reader
M: peek-stream dispose stream>> dispose ; M: peek-stream dispose stream>> dispose ;
@ -33,25 +34,27 @@ M: peek-stream stream-read1
pop nip pop nip
] if-empty ; ] if-empty ;
M:: peek-stream stream-read ( n stream -- sequence ) M:: peek-stream stream-read-unsafe ( n buf stream -- count )
stream peeked>> :> peeked stream peeked>> :> peeked
peeked length :> #peeked peeked length :> #peeked
#peeked 0 = [ #peeked 0 = [
n stream stream>> stream-read n buf stream stream>> stream-read-unsafe
] [ ] [
! Have we already peeked enough? #peeked n >= [
#peeked n > [ peeked <reversed> n head-slice 0 buf copy
peeked <reversed> n cut [ stream stream-like ] peeked [ length n - ] keep shorten
[ <reversed> stream stream-clone-resizable stream peeked<< ] bi* n
] [ ] [
peeked <reversed> peeked <reversed> 0 buf copy
n #peeked - stream stream>> stream-read 0 peeked shorten
stream stream-exemplar append-as n #peeked - :> n'
buf #peeked tail-slice :> buf'
stream stream-exemplar-growable clone stream peeked<< n' buf' stream stream-read-unsafe #peeked +
] if ] if
] if ; ] if ;
M: peek-stream stream-read-partial-unsafe stream-read-unsafe ;
: peek-stream-read-until ( stream seps buf -- stream seps buf sep/f ) : peek-stream-read-until ( stream seps buf -- stream seps buf sep/f )
3dup [ [ stream-read1 dup ] dip member-eq? ] dip swap 3dup [ [ stream-read1 dup ] dip member-eq? ] dip swap
[ drop ] [ over [ push peek-stream-read-until ] [ drop ] if ] if ; [ drop ] [ over [ push peek-stream-read-until ] [ drop ] if ] if ;