]> gitweb.factorcode.org Git - factor.git/commitdiff
io.streams.peek: read-unsafe protocol
authorJoe Groff <arcata@gmail.com>
Thu, 13 Oct 2011 21:09:13 +0000 (14:09 -0700)
committerJoe Groff <arcata@gmail.com>
Tue, 18 Oct 2011 04:23:04 +0000 (21:23 -0700)
extra/io/streams/peek/peek.factor

index 80661efcef08b885dea5232f4c724c7de59087ef..a1dab9a2a30420b8efecad7114cabf670a25ca9c 100644 (file)
@@ -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 <reversed> n cut [ stream stream-like ]
-            [ <reversed> stream stream-clone-resizable stream peeked<< ] bi*
+        #peeked n >= [
+            peeked <reversed> n head-slice 0 buf copy
+            peeked [ length n - ] keep shorten
+            n
         ] [
-            peeked <reversed>
-            n #peeked - stream stream>> stream-read
-            stream stream-exemplar append-as
-
-            stream stream-exemplar-growable clone stream peeked<<
+            peeked <reversed> 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 ;