"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; }