[ANN] Nile: a trait-based stream library

stephane ducasse stephane.ducasse at free.fr
Thu May 3 18:48:23 UTC 2007


I always wonder the cost in terms of speed of the wrapping of streams.

Stef

On 3 mai 07, at 14:18, Damien Cassou wrote:

>> > You would like the framework to let you chain the streams,  
>> aren't you?
>> > So that you have a stream which interact with another stream.
>>
>> Yes, pipes of streams.
>
> I've just created a decoder in a trait and it is highly pluggable :-)
> Let's see an example:
>
> testCombineWithNumberReader
>  | stream |
>  stream := NSSelectStream
>                        selectBlock: [:each | each even]
>                        inputStream: (NSNumberReader
>                                                    inputStream:
> (NSReadableCollectionStream on: '1420 245 211 12')).
>  self deny: stream atEnd.
>  self assert: stream peek = 1420.
>  self assert: stream next = 1420.
>  self deny: stream atEnd.
>  self assert: stream peek = 12.
>  self assert: stream next = 12.
>  self assert: stream atEnd
>
>
> This code uses three stream:
> - NSSelectStream reads its input and only returns elements matching
> the selectBlock (http://wiki.cs.uiuc.edu/PatternStories/SelectStream)
> - NSNumberReader is waiting for characters on its input and converts
> them to numbers. Spaces separate numbers.
> - NSReadableCollectionStream is equivalent to ReadStream.
>
> The implementation part is really cool. NSNumberReader is made of:
>
> - a constructor
> - 3 getters and 3 setters
> - a #realNext method:
> NSNumberReader>>realNext
>  |number|
>  [self inputStream peekFor: Character space] whileTrue.
>  self inputStream atEnd ifTrue: [NSStreamAtEndError signal].
>  number := (self inputStream upTo: Character space) asNumber.
>  ^ number
>
> That's all. Nothing more is needed to create NSNumberReader. The other
> methods come from a trait.
>
> NSSelectBlock is implemented in exactly the same way. It's  
> #realNext is:
>
> NSSelectBlock>>realNext
>  self inputStream do: [:each | (selectBlock value: each) ifTrue: [^  
> each]].
>  NSStreamAtEndError signal.
>
> What do you think?
>
> -- 
> Damien Cassou
>
>




More information about the Squeak-dev mailing list