> On 2 Nov 2017, at 10:10 , Guillermo Polito <guillermopol...@gmail.com> wrote:
> 
> My first hunch is that you don't want to change PositionableStream. Because 
> it works on collections and files (because of inheritance). But not on other 
> kind of streams that are not part of the hierarchy, such as sockets. And we 
> are cleaning that part.
> 
> Instead, some time ago Sven produced a really nice hierarchy of stream 
> decorators. Check the package:
> 
> Zinc-Character-Encoding-Core
> 
> There you have 
> 
> ZnBufferedReadStream
> 
> That implements buffering in an orthogonal way. Maybe it makes more sense to 
> put such method there?
> 

I wanted this to be something light-weight.  I really don’t want to have to 
wrap my stream in a decorator before peeking ahead.

Because I’m doing this in SmaCC, I implemented #explore: (that’s the name I 
chose) in SmaCCLineNumberStream.   But I think that the general solution is to 
put this method in a Trait, so that it can be combined into any stream, whether 
or not that stream inherits from PositionableStream.  There are probably other 
methods that could go in such a trait too.

Actually, the idea of resetting a stream to a prior position is much less 
general, and easier to implement, then general positionability.  Over the 
weekend I posted an issue that discusses positioning a MultiButeFileStream — 
that’s a good example.  

Here is my implementation — really simple.

```
explore: aBlock
        "evaluate aBlock with this stream as argument.  When done, reset my 
position to the current position."
        
        | savedPosition |
        savedPosition := self position.
        [ ^ aBlock value: self ] ensure: [ self position: savedPosition ]
```

        Andrew




Reply via email to