From 6828eeb27e6620236aef55b3870de4c90b5ce23c Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Thu, 13 Oct 2011 14:09:13 -0700 Subject: [PATCH] io.streams.peek: read-unsafe protocol --- extra/io/streams/peek/peek.factor | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/extra/io/streams/peek/peek.factor b/extra/io/streams/peek/peek.factor index 80661efcef..a1dab9a2a3 100644 --- a/extra/io/streams/peek/peek.factor +++ b/extra/io/streams/peek/peek.factor @@ -6,6 +6,7 @@ vectors ; IN: io.streams.peek TUPLE: peek-stream stream peeked ; +INSTANCE: peek-stream noncopying-reader M: peek-stream dispose stream>> dispose ; @@ -33,25 +34,27 @@ M: peek-stream stream-read1 pop nip ] if-empty ; -M:: peek-stream stream-read ( n stream -- sequence ) +M:: peek-stream stream-read-unsafe ( n buf stream -- count ) stream peeked>> :> peeked peeked length :> #peeked #peeked 0 = [ - n stream stream>> stream-read + n buf stream stream>> stream-read-unsafe ] [ - ! Have we already peeked enough? - #peeked n > [ - peeked n cut [ stream stream-like ] - [ stream stream-clone-resizable stream peeked<< ] bi* + #peeked n >= [ + peeked n head-slice 0 buf copy + peeked [ length n - ] keep shorten + n ] [ - peeked - n #peeked - stream stream>> stream-read - stream stream-exemplar append-as - - stream stream-exemplar-growable clone stream peeked<< + peeked 0 buf copy + 0 peeked shorten + n #peeked - :> n' + buf #peeked tail-slice :> buf' + n' buf' stream stream-read-unsafe #peeked + ] if ] if ; +M: peek-stream stream-read-partial-unsafe stream-read-unsafe ; + : peek-stream-read-until ( stream seps buf -- stream seps buf sep/f ) 3dup [ [ stream-read1 dup ] dip member-eq? ] dip swap [ drop ] [ over [ push peek-stream-read-until ] [ drop ] if ] if ;