code: public static <T1, T2, R> ReactiveSeq<R> zip(final Stream<T1> left, final Stream<T2> right, final BiFunction<? super T1, ? super T2, ? extends R> zipper) {
          final Iterator<T1> it1 = left.iterator();
          final Iterator<T2> it2 = right.iterator();
  
          class Zip implements Iterator<R> {
              @Override
              public boolean hasNext() {
                  if (!it1.hasNext()) {
                      close(it2);
                  }
                  if (!it2.hasNext()) {
                      close(it1);
                  }
                  return it1.hasNext() && it2.hasNext();
              }
  
              @Override
              public R next() {
                  return zipper.apply(it1.next(), it2.next());
              }
          }
  
          return ReactiveSeq.fromIterator(new Zip())
                    .onClose(() -> {
                        left.close();
                        right.close();
                    });
      }
docs: Zip two streams into one using a {@link BiFunction} to produce resulting
  values.
  <p>
  <code>
  // ("1:a", "2:b", "3:c")
  Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (i, s) -&gt; i + ":" + s)
  </code>