I sometimes find, when working with a stream, that I need to "peek ahead��� a few items, without disturbing the state of the stream. The message stream peek gives me the next item, but doesn���t generalize to multiple items, �� So I end up writing code like this:�� �� findSomething| savedPosition result |savedPosition := stream position.
stream position: start.
���code involving various manipulations of stream, including stream next"
result := stream position + 1.
stream position: savedPosition.^ resultThis code involves at least two temps, is not very easy to read, and risks not resetting the stream properly if I do a return.It seems to me that a better solution would be what Kent Beck calls an ���execute around��� method:�� �� findSomething^��stream unchangedDuring: [ :s |���code involving various manipulations of stream, including stream next"stream position + 1 ]I���m not sure that I like the name #unchangedDuring:; perhaps you can think of a better one?��The ��implementation of this would bePositionableStream >> #unchangedDuring: aBlock"execute aBlock with self as argument. Ensure that when this method returns,I still have my current state."| savedPosition |savedPosition := self position.
^��[ aBlock value: self ] ensure: [ self position: savedPosition ]or perhapsPositionableStream >> #unchangedDuring: aBlock
"execute aBlock with self as argument. Ensure that when this method returns,I still have my current state."
^��[��aBlock value: self copy ]which might be better in the case that the stream is a file stream and aBlock causes the buffer to be refreshed from the disk.
- Do other Smalltalks have a method like this? ��
- Does it already exist in Pharo, somewhere that I���ve failed to look?��
- Would it be a worthwhile addition to Pharo? ��
- What would be a good name?