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