FilteringStream.st
changeset 401 f97488701314
child 472 33f423823933
--- /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 $'
+! !