= Solution
Use <short-circuit evaluation> so that even an availability test of the second <iterator> is delayed until the first is exhausted:
``
class ConcatIterator[T](first: Iterator[T], second: Iterator[T])
extends Iterator[T] {
def hasNext: Boolean = first.hasNext || second.hasNext
def next(): T = {
if (first.hasNext) first.next()
else if (second.hasNext) second.next()
else throw new java.util.NoSuchElementException("empty concatenation")
}
}
``
Each successful call returns from the first producer while it has entries, then from the second. There is no constructor-time request or element prefetch. This implements concatenation of the producers' remaining <sequences>, subject to their ordinary <iterator> contracts.
Back to article page