With the addition of transducers, a new opportunity for optimization has opened up, specifically around data generation functions like cycle and repeat. There are however several obstacles to simply enabling IReduce on these functions:
- Backwards compatibility must be maintained, i.e. these functions should still return seqs
- If existing functions use chunked sequences it may be unwise to downgrade the functions to 'normal' seqs as a side-effect of enabling IReduce
- Most of these functions do not have an arity overload available that makes sense to return a reducible vs a seq
Considered Solutions:
- Forget about making these things implement IReduce
- Implement a new function with a different name (and naming convention) that returns something that implements IReduce.
Create a reducable LazySeq. Something that looks/acts like LazySeq, but also has a IFn field that says "if you want to reduce, this is the reducing function", then repeat could look something like this:
While this could work, it also involves an addition allocation (the reduce logic function) on every cell in a lazy seq, probably not optimal.
- Probably other options I haven't thought about.....