added #peek
authorClaus Gittinger <cg@exept.de>
Mon, 22 May 2000 13:11:30 +0200
changeset 889 b3bfa0862f55
parent 888 a868b0e54a2b
child 890 40421d1c3377
added #peek
FilteringStream.st
--- a/FilteringStream.st	Mon May 08 15:57:42 2000 +0200
+++ b/FilteringStream.st	Mon May 22 13:11:30 2000 +0200
@@ -1,5 +1,3 @@
-"{ Package: 'stx:goodies' }"
-
 "
  COPYRIGHT (c) 1996 by Claus Gittinger
 	      All Rights Reserved
@@ -13,7 +11,9 @@
 "
 
 
-Stream subclass:#FilteringStream
+"{ Package: 'stx:goodies' }"
+
+PeekableStream subclass:#FilteringStream
 	instanceVariableNames:'inputStream outputStream filter readAhead'
 	classVariableNames:''
 	poolDictionaries:''
@@ -81,21 +81,21 @@
 examples
 "
   pushing the contents of a stream onto another stream
-  (here, the Transcript) without a need to read everyting into a
+  (here, the Transcript) without a need to read everything into a
   buffer or to reinvent the read-loop:
   (notice, a FilteringLineStream does this with less overhead,
    due to the byte-wise reading done here)
-								[exBegin]
+                                                                [exBegin]
     |in pusher|
 
     in := 'Makefile' asFilename readStream.
     pusher := FilteringStream readingFrom:in writingTo:Transcript.
     pusher filterUpToEnd
-								[exEnd]
+                                                                [exEnd]
 
 
   filter random numbers:
-								[exBegin]
+                                                                [exBegin]
     |in filter|
 
     in := Random new.
@@ -104,44 +104,44 @@
     filter filter:[:num | ((num >= 0.5) and:[num <= 0.6]) ifTrue:[num] ifFalse:[nil]].
 
     20 timesRepeat:[
-	Transcript showCR:(filter next printString).
+        Transcript showCR:(filter next printString).
     ]
-								[exEnd]
+                                                                [exEnd]
 
   filtering prime numbers:
-								[exBegin]
+                                                                [exBegin]
     |num generator primeFilter addFilter|
 
     num := 1.
     generator := Plug new.
     generator respondTo:#next
-		   with:[num := num + 1. num].
+                   with:[num := num + 1. num].
     generator respondTo:#atEnd
-		   with:[false].
+                   with:[false].
 
     addFilter := [:prime | |newFilter|
-	newFilter := FilteringLineStream basicNew.
-	newFilter filter:[:num | (num \\ prime) == 0 ifTrue:[
-				    nil
-				 ] ifFalse:[
-				    num
-				 ]
-			 ].
-	newFilter inputStream:primeFilter.
-	primeFilter := newFilter
+        newFilter := FilteringStream basicNew.
+        newFilter filter:[:num | (num \\ prime) == 0 ifTrue:[
+                                    nil
+                                 ] ifFalse:[
+                                    num
+                                 ]
+                         ].
+        newFilter inputStream:primeFilter.
+        primeFilter := newFilter
     ].
 
     addFilter value:2.
     primeFilter inputStream:generator.
 
     10000 timesRepeat:[
-	|nextPrime|
+        |nextPrime|
 
-	nextPrime := primeFilter next.
-	addFilter value:nextPrime.
-	Transcript showCR:nextPrime.
+        nextPrime := primeFilter next.
+        addFilter value:nextPrime.
+        Transcript showCR:nextPrime.
     ]
-								[exEnd]
+                                                                [exEnd]
 "
 
 
@@ -249,6 +249,63 @@
 
     "Created: 2.7.1996 / 21:09:58 / cg"
     "Modified: 11.1.1997 / 17:17:27 / cg"
+!
+
+peek
+    "peek ahead for the next character"
+
+    |input output|
+
+    readAhead notNil ifTrue:[
+        ^ readAhead
+    ].
+
+    [inputStream atEnd] whileFalse:[
+        "/ get an element
+        input := inputStream peek.
+        filter isNil ifTrue:[
+            ^ input
+        ].
+
+        "/ filter it - this may return nil, to eat it
+        inputStream next.
+        output := filter value:input.
+        output notNil ifTrue:[
+            "/ good - output it
+            readAhead := output.
+            ^ output.
+        ].
+    ].
+    ^ self pastEnd
+
+!
+
+peekOrNil
+    "peek ahead for the next character, or return nil"
+
+    |input output|
+
+    readAhead notNil ifTrue:[
+        ^ readAhead
+    ].
+
+    [inputStream atEnd] whileFalse:[
+        "/ get an element
+        input := inputStream peek.
+        filter isNil ifTrue:[
+            ^ input
+        ].
+
+        "/ filter it - this may return nil, to eat it
+        inputStream next.
+        output := filter value:input.
+        output notNil ifTrue:[
+            "/ good - output it
+            readAhead := output.
+            ^ output.
+        ].
+    ].
+    ^ nil
 ! !
 
 !FilteringStream methodsFor:'access - push-writing'!
@@ -380,5 +437,5 @@
 !FilteringStream class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/FilteringStream.st,v 1.6 2000-03-02 14:15:08 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/FilteringStream.st,v 1.7 2000-05-22 11:11:30 cg Exp $'
 ! !