I always lived under the impression that after calling
it.take(n) the original iterator
it must be discarded, as it is left in an undefined state. Some implementations, for example
NewVectorIterator, implement an optimization by essentially changing the semantics to
However, now I see no documentation mentioning that, like in the case of
SliceIterator does not, for example, use this optimization.
Additionally, it may even be unintuitive behaviour. In this situation I am not sure where I stand. If the original iterator is left in an undefined state by essentially all methods other than
take, then we can make such optimizations. If not, then splitting iterator contents (doing something with the first
n elements, and something else with the rest) becomes that much easier, as it doesn’t require calling
splitAt. As it is, we got the worst of both worlds.
Is it only an ommission in the docummentation and the intent was always clear(), or is it a bit of a whole in the language semantics?