code: public static <T> Stream<T> merge(
              @NotNull Iterator<? extends T> iterator1,
              @NotNull Iterator<? extends T> iterator2,
              @NotNull BiFunction<? super T, ? super T, ObjMerge.MergeResult> selector) {
          Objects.requireNonNull(iterator1);
          Objects.requireNonNull(iterator2);
          return new Stream<T>(new ObjMerge<T>(iterator1, iterator2, selector));
      }
docs: Merges elements of two iterators according to the supplied selector function.
  
  <p>Example 1 — Merge two sorted iterators:
  <pre>
  iterator1: [1, 3, 8, 10]
  iterator2: [2, 5, 6, 12]
  selector: (a, b) -&gt; a &lt; b ? TAKE_FIRST : TAKE_SECOND
  result: [1, 2, 3, 5, 6, 8, 10, 12]
  </pre>
  
  <p>Example 2 — Concat two iterators:
  <pre>
  iterator1: [0, 3, 1]
  iterator2: [2, 5, 6, 1]
  selector: (a, b) -&gt; TAKE_SECOND
  result: [2, 5, 6, 1, 0, 3, 1]
  </pre>
  
  @param <T> the type of the elements
  @param iterator1  the first iterator
  @param iterator2  the second iterator
  @param selector  the selector function used to choose elements
  @return the new stream
  @throws NullPointerException if {@code iterator1} or {@code iterator2} is null
  @since 1.1.9