Add metamorph function #105
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I want to propose including the following function into the streaming prelude:
I have written this function — or more specialized versions of it, like
mapMaybeWithState
orfilterWithState
— numerous times, and I think it is suitably useful and general enough to warrant inclusion in the streaming package itself.The name
metamorph
is due to Jeremy Gibbons [1], who describes a metamorphism as "an unfold after a fold; typically, it will convert from one data representation to another". Practically speaking, this operation allows one to insert, remove, and transform elements of a stream and to use some internal state while doing so.I included some usage examples in the Haddock comment of the function, which I reproduce below. (It's tricky finding good examples that aren't overly complex. Personally, I've used this function to de-interleave log-lines before further processing and to transform low-level event streams into more high-level representations, which often involves resolving dynamic references declared previously in the stream and so on.)
Stateful filtering:
A simple line-wrapping algorithm:
[1] Jeremy Gibbons. Metamorphisms: Streaming representation-changers. Science of Computer Programming, 65:108-139, 2007. http://www.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/metamorphisms-scp.pdf