    "An [[Iterator]] that returns the elements of two
     [[Iterable]]s, as if they were chained together."
    see (`function Iterable.chain`)
    by ("Enrique Zamudio")
    tagged("Streams")
    class ChainedIterator<out Element,out Other>
    		        ({Element*} first, {Other*} second)
            satisfies Iterator<Element|Other> {

        variable Iterator<Element|Other> iter = first.iterator();
        variable value more = true;

        shared actual Element|Other|Finished next() {
            value element = iter.next();
            if (more && element is Finished) {
                iter = second.iterator();
                more = false;
                return iter.next();
            }
            else {
                return element;
            }
        }

        string => "``first``.chain(``second``).iterator()";
    }