private Object readResolve() { return isEmpty() ? EMPTY : this; }
@Override public Vector<T> peek(Consumer<? super T> action) { Objects.requireNonNull(action, "action is null"); if (!isEmpty()) { action.accept(head()); } return this; }
@Override public Vector<T> orElse(Supplier<? extends Iterable<? extends T>> supplier) { return isEmpty() ? ofAll(supplier.get()) : this; }
@Override public Vector<T> orElse(Iterable<? extends T> other) { return isEmpty() ? ofAll(other) : this; }
@Override public Vector<T> sorted(Comparator<? super T> comparator) { Objects.requireNonNull(comparator, "comparator is null"); return isEmpty() ? this : toJavaStream().sorted(comparator).collect(collector()); }
@Override public Vector<T> sorted() { if (isEmpty()) { return this; } else { @SuppressWarnings("unchecked") final T[] list = (T[]) toJavaArray(); Arrays.sort(list); return Vector.of(list); } }
@Override public Iterator<T> iterator() { return isEmpty() ? Iterator.empty() : trie.iterator(); }
@Override public Vector<T> appendAll(Iterable<? extends T> iterable) { Objects.requireNonNull(iterable, "iterable is null"); if (isEmpty()) { return ofAll(iterable); } if (io.vavr.collection.Collections.isEmpty(iterable)){ return this; } return new Vector<>(trie.appendAll(iterable)); }
@Override public Vector<T> prependAll(Iterable<? extends T> iterable) { Objects.requireNonNull(iterable, "iterable is null"); if (isEmpty()) { return ofAll(iterable); } if (io.vavr.collection.Collections.isEmpty(iterable)){ return this; } return new Vector<>(trie.prependAll(iterable)); }
@Override public Option<Vector<T>> initOption() { return isEmpty() ? Option.none() : Option.some(init()); }
@Override public Option<Vector<T>> tailOption() { return isEmpty() ? Option.none() : Option.some(tail()); }
@Override public Vector<T> slice(int beginIndex, int endIndex) { if ((beginIndex >= endIndex) || (beginIndex >= size()) || isEmpty()) { return empty(); } else if ((beginIndex <= 0) && (endIndex >= length())) { return this; } else { return take(endIndex).drop(beginIndex); } }
/** * Chooses one of the given generators according to their frequency. * Only generators with positive frequencies ares used in returned * generator. * * @param generators A non-empty traversable of Tuples (frequency, generator) * @param <T> Type to be generated * @return A new T generator * @throws java.lang.NullPointerException if generators is null * @throws java.lang.IllegalArgumentException if generators doesn't contain any generator with positive frequency */ static <T> Gen<T> frequency(Iterable<Tuple2<Integer, Gen<T>>> generators) { Objects.requireNonNull(generators, "generators is null"); final Vector<Tuple2<Integer, Gen<T>>> filtered = Iterator.ofAll(generators) .filter(t -> t._1() > 0).toVector(); if (filtered.isEmpty()) { throw new IllegalArgumentException("no generator with positive weight"); } final int size = filtered.map(t -> t._1).sum().intValue(); return choose(1, size).flatMap(n -> GenModule.frequency(n, filtered.iterator())); }
@Override public Vector<Vector<T>> permutations() { if (isEmpty()) { return empty(); } else if (length() == 1) { return of(this); } else { Vector<Vector<T>> results = empty(); for (T t : distinct()) { for (Vector<T> ts : remove(t).permutations()) { results = results.append(of(t).appendAll(ts)); } } return results; } }
@Override public Vector<T> peek(Consumer<? super T> action) { Objects.requireNonNull(action, "action is null"); if (!isEmpty()) { action.accept(head()); } return this; }
@Override public Vector<T> sorted(Comparator<? super T> comparator) { Objects.requireNonNull(comparator, "comparator is null"); return isEmpty() ? this : toJavaStream().sorted(comparator).collect(collector()); }
@Override public Vector<T> sorted() { if (isEmpty()) { return this; } else { @SuppressWarnings("unchecked") final T[] list = (T[]) toJavaArray(); Arrays.sort(list); return Vector.of(list); } }
@Override public Iterator<T> iterator() { return isEmpty() ? Iterator.empty() : trie.iterator(); }
@Override public Vector<T> prependAll(Iterable<? extends T> iterable) { Objects.requireNonNull(iterable, "iterable is null"); if (isEmpty()) { return ofAll(iterable); } if (io.vavr.collection.Collections.isEmpty(iterable)){ return this; } return new Vector<>(trie.prependAll(iterable)); }
@Override public Vector<T> slice(int beginIndex, int endIndex) { if ((beginIndex >= endIndex) || (beginIndex >= size()) || isEmpty()) { return empty(); } else if ((beginIndex <= 0) && (endIndex >= length())) { return this; } else { return take(endIndex).drop(beginIndex); } }