> 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