@Override public Iterator<T> iterator() { return Iterator.empty(); }
@Override public Iterator<LeafNode<K, V>> nodes() { return Iterator.empty(); }
static <T> Iterator<T> tabulate(int n, Function<? super Integer, ? extends T> f) { Objects.requireNonNull(f, "f is null"); if (n <= 0) { return Iterator.empty(); } else { return new AbstractIterator<T>() { int i = 0; @Override public boolean hasNext() { return i < n; } @Override protected T getNext() { return f.apply(i++); } }; } }
static <T> Iterator<T> fillObject(int n, T element) { if (n <= 0) { return Iterator.empty(); } else { return Iterator.continually(element).take(n); } }
@Override default Iterator<T> distinctBy(Comparator<? super T> comparator) { Objects.requireNonNull(comparator, "comparator is null"); if (!hasNext()) { return empty(); } else { return new DistinctIterator<>(this, TreeSet.empty(comparator), Function.identity()); } }
@Override public Iterator<T> iterator() { return isEmpty() ? Iterator.empty() : trie.iterator(); }
@Override default Iterator<T> distinct() { if (!hasNext()) { return empty(); } else { return new DistinctIterator<>(this, io.vavr.collection.HashSet.empty(), Function.identity()); } }
@Override default <U> Iterator<T> distinctBy(Function<? super T, ? extends U> keyExtractor) { Objects.requireNonNull(keyExtractor, "keyExtractor is null"); if (!hasNext()) { return empty(); } else { return new DistinctIterator<>(this, io.vavr.collection.HashSet.empty(), keyExtractor); } }
@Override default Iterator<R> iterator() { if (isRight()) { return Iterator.of(get()); } else { return Iterator.empty(); } }
@Override public Iterator<L> iterator() { if (either.isLeft()) { return Iterator.of(either.getLeft()); } else { return Iterator.empty(); } }
@Override default Tuple2<Iterator<T>, Iterator<T>> partition(Predicate<? super T> predicate) { Objects.requireNonNull(predicate, "predicate is null"); if (!hasNext()) { return Tuple.of(empty(), empty()); } else { final Stream<T> that = Stream.ofAll(this); final Iterator<T> first = that.iterator().filter(predicate); final Iterator<T> second = that.iterator().filter(predicate.negate()); return Tuple.of(first, second); } }
@Override default Iterator<T> dropWhile(Predicate<? super T> predicate) { Objects.requireNonNull(predicate, "predicate is null"); if (!hasNext()) { return empty(); } else { final CachedIterator<T> that = new CachedIterator<>(this); while (that.hasNext() && predicate.test(that.touch())) { that.next(); } return that; } }
@Override default Iterator<T> iterator() { return isEmpty() ? Iterator.empty() : Iterator.of(get()); }
@Override default Iterator<T> iterator() { return isEmpty() ? Iterator.empty() : Iterator.of(get()); }
@Override default Iterator<T> iterator() { return isSuccess() ? Iterator.of(get()) : Iterator.empty(); }
@Override default Iterator<T> iterator() { return isValid() ? Iterator.of(get()) : Iterator.empty(); }
@Override default <T1, T2, T3> Tuple3<Iterator<T1>, Iterator<T2>, Iterator<T3>> unzip3( Function<? super T, Tuple3<? extends T1, ? extends T2, ? extends T3>> unzipper) { Objects.requireNonNull(unzipper, "unzipper is null"); if (!hasNext()) { return Tuple.of(empty(), empty(), empty()); } else { final Stream<Tuple3<? extends T1, ? extends T2, ? extends T3>> source = Stream.ofAll(this.map(unzipper)); return Tuple.of(source.map(t -> (T1) t._1).iterator(), source.map(t -> (T2) t._2).iterator(), source.map(t -> (T3) t._3).iterator()); } }
@Override default Tuple2<Iterator<T>, Iterator<T>> span(Predicate<? super T> predicate) { Objects.requireNonNull(predicate, "predicate is null"); if (!hasNext()) { return Tuple.of(empty(), empty()); } else { final Stream<T> that = Stream.ofAll(this); return Tuple.of(that.iterator().takeWhile(predicate), that.iterator().dropWhile(predicate)); } }
@Override default <T1, T2> Tuple2<Iterator<T1>, Iterator<T2>> unzip( Function<? super T, Tuple2<? extends T1, ? extends T2>> unzipper) { Objects.requireNonNull(unzipper, "unzipper is null"); if (!hasNext()) { return Tuple.of(empty(), empty()); } else { final Stream<Tuple2<? extends T1, ? extends T2>> source = Stream.ofAll(this.map(unzipper)); return Tuple.of(source.map(t -> (T1) t._1).iterator(), source.map(t -> (T2) t._2).iterator()); } }
@SuppressWarnings("unchecked") static <T, S extends Seq<T>> Iterator<S> crossProduct(S empty, S seq, int power) { if (power < 0) { return Iterator.empty(); } else { return Iterator.range(0, power) .foldLeft(Iterator.of(empty), (product, ignored) -> product.flatMap(el -> seq.map(t -> (S) el.append(t)))); } }