--- 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 $'
! !