code: @SafeVarargs
      public static <T, O> Stream<O> merge(Supplier<O> unitSupplier, BiFunction<O, T, O> merger, Stream<T>...streams) {
          Spliterator<T>[] spliterators = (Spliterator<T>[]) Stream.of(streams).map(BaseStream::spliterator).toArray(Spliterator[]::new);
          return StreamSupport.stream(MergingSpliterator.merging(spliterators, unitSupplier, merger), false)
                  .onClose(closerFor(streams));
      }
docs: Construct a stream which merges together values from the supplied streams, somewhat in the manner of the
  stream constructed by {@link com.codepoetics.protonpack.StreamUtils#zip(java.util.stream.Stream, java.util.stream.Stream, java.util.function.BiFunction)},
  but for an arbitrary number of streams and using a merger to merge the values from multiple streams
  into an accumulator.
  
  @param unitSupplier Supplies the initial "zero" or "unit" value for the accumulator.
  @param merger Merges each item from the collection of values taken from the source streams into the accumulator value.
  @param streams The streams to merge.
  @param <T> The type over which the merged streams stream.
  @param <O> The type of the accumulator, over which the constructed stream streams.
  @return A merging stream.