So the idea is this (I'll use Observable.zip as an example):
Assume:
Observable.zip(observable1, observable2, iterable);
The iterable will be treated differently, in that instead of being converted to an Observable and firehosing out nexts, it will get an iterator and next() once, waiting for the other Observables to emit.. as soon as the zip emits, the iterator will next() once more, and so on.
Each time the iterator.next() is called, the IteratorResult will be examined to see if it's done, if it's done, it will flag itself as no longer active and the Observable will end