code: @CheckReturnValue
      @SchedulerSupport(SchedulerSupport.NONE)
      public static <T, R> Single<R> zip(final Iterable<? extends SingleSource<? extends T>> sources, Function<? super Object[], ? extends R> zipper) {
          ObjectHelper.requireNonNull(zipper, "zipper is null");
          ObjectHelper.requireNonNull(sources, "sources is null");
          return RxJavaPlugins.onAssembly(new SingleZipIterable<T, R>(sources, zipper));
      }
docs: Waits until all SingleSource sources provided by the Iterable sequence signal a success
  value and calls a zipper function with an array of these values to return a result
  to be emitted to downstream.
  <p>
  If the {@code Iterable} of {@link SingleSource}s is empty a {@link NoSuchElementException} error is signalled after subscription.
  <p>
  Note on method signature: since Java doesn't allow creating a generic array with {@code new T[]}, the
  implementation of this operator has to create an {@code Object[]} instead. Unfortunately, a
  {@code Function<Integer[], R>} passed to the method would trigger a {@code ClassCastException}.
  
  <p>
  <img width="640" height="380" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/zip.png" alt="">
  <p>
  If any of the SingleSources signal an error, all other SingleSources get disposed and the
  error emitted to downstream immediately.
  <dl>
  <dt><b>Scheduler:</b></dt>
  <dd>{@code zip} does not operate by default on a particular {@link Scheduler}.</dd>
  </dl>
  @param <T> the common value type
  @param <R> the result value type
  @param sources the Iterable sequence of SingleSource instances. An empty sequence will result in an
  {@code onError} signal of {@link NoSuchElementException}.
  @param zipper the function that receives an array with values from each SingleSource
  and should return a value to be emitted to downstream
  @return the new Single instance
  @since 2.0