"Given one or more argument [[streams|iterables]], return a
stream containing elements of the given streams. The
elements are ordered first according to their position in
the argument stream, and then according to the stream in
which they occur. The resulting stream contains exactly the
same number of elements from each stream.
For example, the expression
interleave(1..5, \"-+\".cycled)
results in the stream
`{ 1, '-', 2, '+', 3, '-', 4, '+', 5, '-' }`."
see (`function Iterable.interpose`)
tagged("Streams")
since("1.1.0")
shared Iterable<Element,Absent>
interleave<Element,Absent>
(Iterable<Element,Absent>+ iterables)
given Absent satisfies Null
=> object satisfies Iterable<Element,Absent> {
size => min { for (it in iterables) it.size } * iterables.size;
empty => package.any { for (it in iterables) it.empty };
iterator() => object satisfies Iterator<Element> {
value iterators
= iterables.collect((Iterable<Element> it)
=> it.iterator());
variable value which = 0;
shared actual Element|Finished next() {
assert (exists iter = iterators[which]);
if (!is Finished next = iter.next()) {
if (++which>=iterators.size) {
which = 0;
}
return next;
}
else {
return finished;
}
}
};
};