--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FilteringStream.st Tue Jul 02 21:28:43 1996 +0200
@@ -0,0 +1,199 @@
+Stream subclass:#FilteringStream
+ instanceVariableNames:'inputStream outputStream filter unbound'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Streams'
+!
+
+!FilteringStream class methodsFor:'documentation'!
+
+examples
+"
+ filter random numbers:
+
+ |in filter|
+
+ in := Random new.
+
+ filter := FilteringLineStream basicNew.
+ filter inputStream:in.
+ filter filter:[:num | ((num >= 0.5) and:[num <= 0.6]) ifTrue:[num] ifFalse:[nil]].
+
+ 20 timesRepeat:[
+ Transcript showCR:(filter next printString).
+ ]
+
+ filtering prime numbers:
+
+ |num generator primeFilter addFilter|
+
+ num := 1.
+ generator := Plug new.
+ generator respondTo:#next
+ with:[num := num + 1. num].
+ generator respondTo:#atEnd
+ with:[false].
+
+ addFilter := [:prime | |newFilter|
+ newFilter := FilteringLineStream basicNew.
+ newFilter unbound:true.
+ newFilter filter:[:num | (num \\ prime) == 0 ifTrue:[
+ nil
+ ] ifFalse:[
+ num
+ ]
+ ].
+ newFilter inputStream:primeFilter.
+ primeFilter := newFilter
+ ].
+
+ addFilter value:2.
+ primeFilter inputStream:generator.
+
+ 100000 timesRepeat:[
+ |nextPrime|
+
+ nextPrime := primeFilter next.
+ addFilter value:nextPrime.
+ Transcript showCR:nextPrime.
+ ]
+"
+
+
+
+! !
+
+!FilteringStream methodsFor:'access - pull-reading'!
+
+filterUpToEnd
+ "pull input from inputStream up to the end,
+ push it filtered into the outputStream"
+
+ [inputStream atEnd] whileFalse:[
+ self nextPut:(inputStream next)
+ ].
+
+ "Modified: 2.7.1996 / 21:02:49 / cg"
+ "Created: 2.7.1996 / 21:06:42 / cg"
+!
+
+next
+ "pull input from inputStream and
+ push it filtered into the outputStream"
+
+ |input output|
+
+ [inputStream atEnd] whileFalse:[
+ input := inputStream next.
+ output := filter value:input.
+ output notNil ifTrue:[
+ ^ output.
+ ].
+ ].
+ ^ nil
+
+ "Created: 2.7.1996 / 21:09:58 / cg"
+! !
+
+!FilteringStream methodsFor:'access - push-writing'!
+
+nextPut:something
+ "push something through the filter"
+
+ |output|
+
+ output := filter value:something.
+ output notNil ifTrue:[
+ outputStream nextPut:output
+ ]
+
+ "Created: 2.7.1996 / 21:07:58 / cg"
+! !
+
+!FilteringStream methodsFor:'accessing'!
+
+filter
+ "return the filter"
+
+ ^ filter
+
+ "Modified: 2.7.1996 / 21:03:36 / cg"
+ "Created: 2.7.1996 / 21:06:42 / cg"
+!
+
+filter:something
+ "set the filter"
+
+ filter := something.
+
+ "Modified: 2.7.1996 / 21:03:40 / cg"
+ "Created: 2.7.1996 / 21:06:42 / cg"
+!
+
+inputStream
+ "return the inputStream"
+
+ ^ inputStream
+
+ "Modified: 2.7.1996 / 21:03:43 / cg"
+ "Created: 2.7.1996 / 21:06:42 / cg"
+!
+
+inputStream:something
+ "set the inputStream"
+
+ inputStream := something.
+
+ "Modified: 2.7.1996 / 21:03:46 / cg"
+ "Created: 2.7.1996 / 21:06:42 / cg"
+!
+
+outputStream
+ "return the outputStream"
+
+ ^ outputStream
+
+ "Modified: 2.7.1996 / 21:03:49 / cg"
+ "Created: 2.7.1996 / 21:06:42 / cg"
+!
+
+outputStream:something
+ "set the outputStream"
+
+ outputStream := something.
+
+ "Modified: 2.7.1996 / 21:03:52 / cg"
+ "Created: 2.7.1996 / 21:06:42 / cg"
+!
+
+unbound
+ "return unbound"
+
+ ^ unbound
+
+ "Created: 2.7.1996 / 21:25:40 / cg"
+!
+
+unbound:something
+ "set unbound"
+
+ unbound := something.
+
+ "Created: 2.7.1996 / 21:25:40 / cg"
+! !
+
+!FilteringStream methodsFor:'queries'!
+
+atEnd
+ unbound ifTrue:[^ false].
+ ^ inputStream atEnd
+
+ "Created: 2.7.1996 / 21:19:51 / cg"
+ "Modified: 2.7.1996 / 21:25:53 / cg"
+! !
+
+!FilteringStream class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libbasic2/FilteringStream.st,v 1.1 1996-07-02 19:28:43 cg Exp $'
+! !