FilteringStream.st
author Claus Gittinger <cg@exept.de>
Tue, 02 Jul 1996 21:28:43 +0200
changeset 401 f97488701314
child 472 33f423823933
permissions -rw-r--r--
*** empty log message ***

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