io.streams.peek: read-unsafe protocol
parent
a9ab3db167
commit
6828eeb27e
|
@ -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 ;
|
||||||
|
|
Loading…
Reference in New Issue