    "Given two streams, form a new stream by applying a
     function to the arguments in the given streams. The
     length of the resulting stream is the length of
     the shorter of the two given streams.

     Thus:

         mapPairs(xs,ys,fun)[i]==fun(xs[i],ys[i])

     for every `0<=i<min({xs.size,ys.size})`."
    shared {Result*} mapPairs<Result,FirstArgument,SecondArgument>(
        Result collecting(FirstArgument firstArg, SecondArgument secondArg),
        {FirstArgument*} firstArguments,
        {SecondArgument*} secondArguments
    ) {
        object iterable satisfies {Result*} {
            shared actual Iterator<Result> iterator() {
                value first = firstArguments.iterator();
                value second = secondArguments.iterator();
                object iterator satisfies Iterator<Result> {
                    shared actual Result|Finished next() {
                        if (!is Finished firstArg=first.next(),
                            !is Finished secondArg=second.next()) {
                            return collecting(firstArg,secondArg);
                        }
                        else {
                            return finished;
                        }
                    }
                }
                return iterator;
            }
        }
        return iterable;
    }