public final @NotNull <T> JBIterable<T> intercept(@NotNull Function<? super Iterator<? extends E>, ? extends Iterator<? extends T>> function) {
    if (this == EMPTY) return empty();
    if (this instanceof Intercepted) {
      Intercepted<E, E> intercepted = (Intercepted<E, E>)this;
      Function<Iterator<? extends E>, Iterator<? extends T>> compose = Functions.compose(intercepted.interceptor, function);
      return new Intercepted<>(intercepted.original, compose);
    }
    return new Intercepted<>(this, function);
  }
public final @NotNull <T> JBIterable<T> intercept(@NotNull Function<? super Iterator<? extends E>, ? extends Iterator<? extends T>> function)