/* __ __ __ __ __ ___ * \ \ / / \ \ / / __/ * \ \/ / /\ \ \/ / / * \____/__/ \__\____/__/.ɪᴏ * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ */ package io.vavr.collection; import io.vavr.Function1; import io.vavr.PartialFunction; import io.vavr.Tuple3; import io.vavr.Tuple2; import io.vavr.control.Option; import java.io.Serializable; import java.util.Comparator; import java.util.function.*; /** * An immutable {@code Set} interface. * <p> * CAUTION: The Vavr {@code Set} implementations generally support {@code null} elements. However {@code SortedSet} * implementations require an element {@code Comparator}, which may not support {@code null} elements. * <p> * Examples: * * <pre>{@code Set<?> addNull(Set<?> set) { * * // CAUTION: Do not expect a Set to accept null values in general! * return set.add(null); * * } * * void test() { * * // ok * addNull(HashSet.of(1)); * * // ok * addNull(TreeSet.of(nullsFirst(naturalOrder()), 1)); * * // ok * addNull(TreeSet.empty()); * * // throws NPE! * addNull(TreeSet.of(1)); * * }}</pre> * * <p> * Basic operations: * * <ul> * <li>{@link #add(Object)}</li> * <li>{@link #addAll(Iterable)}</li> * <li>{@link #diff(Set)}</li> * <li>{@link #intersect(Set)}</li> * <li>{@link #remove(Object)}</li> * <li>{@link #removeAll(Iterable)}</li> * <li>{@link #union(Set)}</li> * </ul> * * Conversion: * * <ul> * <li>{@link #toJavaSet()}</li> * </ul> * * @param <T> Component type * @author Daniel Dietrich, Ruslan Sennov */ public interface Set<T> extends Traversable<T>, Function1<T, Boolean>, Serializable { long serialVersionUID = 1L; /** * Narrows a widened {@code Set<? extends T>} to {@code Set<T>} * by performing a type-safe cast. This is eligible because immutable/read-only * collections are covariant. * * @param set A {@code Set}. * @param <T> Component type of the {@code Set}. * @return the given {@code set} instance as narrowed type {@code Set<T>}. */ @SuppressWarnings("unchecked") static <T> Set<T> narrow(Set<? extends T> set) { return (Set<T>) set; } /** * Add the given element to this set, if it is not already contained. * * @param element The element to be added. * @return A new set containing all elements of this set and also {@code element}. */ Set<T> add(T element); /** * Adds all of the given elements to this set, if not already contained. * * @param elements The elements to be added. * @return A new set containing all elements of this set and the given {@code elements}, if not already contained. */ Set<T> addAll(Iterable<? extends T> elements); /** * Tests if a given {@code element} is contained in this {@code Set}. * <p> * This method is equivalent to {@link #contains(Object)}. * * @param element the element to test for membership. * @return {@code true} if the given {@code element} is contained, {@code false} otherwise. */ @Override default Boolean apply(T element) { return contains(element); } /** * Calculates the difference between this set and another set. * <p> * See also {@link #removeAll(Iterable)}. * * @param that Elements to be removed from this set. * @return A new Set containing all elements of this set which are not located in {@code that} set. */ Set<T> diff(Set<? extends T> that); /** * Computes the intersection between this set and another set. * <p> * See also {@link #retainAll(Iterable)}. * * @param that the set to intersect with. * @return A new Set consisting of all elements that are both in this set and in the given set {@code that}. */ Set<T> intersect(Set<? extends T> that); /** * Removes a specific element from this set, if present. * * @param element The element to be removed from this set. * @return A new set consisting of the elements of this set, without the given {@code element}. */ Set<T> remove(T element); /** * Removes all of the given elements from this set, if present. * * @param elements The elements to be removed from this set. * @return A new set consisting of the elements of this set, without the given {@code elements}. */ Set<T> removeAll(Iterable<? extends T> elements); /** * Converts this Vavr {@code Set} to a {@code java.util.Set} while preserving characteristics * like insertion order ({@code LinkedHashSet}) and sort order ({@code SortedSet}). * * @return a new {@code java.util.Set} instance */ @Override java.util.Set<T> toJavaSet(); /** * Adds all of the elements of {@code that} set to this set, if not already present. * <p> * See also {@link #addAll(Iterable)}. * * @param that The set to form the union with. * @return A new set that contains all distinct elements of this and {@code that} set. */ Set<T> union(Set<? extends T> that); // -- Adjusted return types of Traversable methods @Override <R> Set<R> collect(PartialFunction<? super T, ? extends R> partialFunction); @Override boolean contains(T element); @Override Set<T> distinct(); @Override Set<T> distinctBy(Comparator<? super T> comparator); @Override <U> Set<T> distinctBy(Function<? super T, ? extends U> keyExtractor); @Override Set<T> drop(int n); @Override Set<T> dropRight(int n); @Override Set<T> dropUntil(Predicate<? super T> predicate); @Override Set<T> dropWhile(Predicate<? super T> predicate); @Override Set<T> filter(Predicate<? super T> predicate); @Override <U> Set<U> flatMap(Function<? super T, ? extends Iterable<? extends U>> mapper); @Override <C> Map<C, ? extends Set<T>> groupBy(Function<? super T, ? extends C> classifier); @Override Iterator<? extends Set<T>> grouped(int size); @Override Set<T> init(); @Override Option<? extends Set<T>> initOption(); @Override default boolean isDistinct() { return true; } @Override Iterator<T> iterator(); @Override int length(); @Override <U> Set<U> map(Function<? super T, ? extends U> mapper); @Override Set<T> orElse(Iterable<? extends T> other); @Override Set<T> orElse(Supplier<? extends Iterable<? extends T>> supplier); @Override Tuple2<? extends Set<T>, ? extends Set<T>> partition(Predicate<? super T> predicate); @Override Set<T> peek(Consumer<? super T> action); @Override Set<T> replace(T currentElement, T newElement); @Override Set<T> replaceAll(T currentElement, T newElement); @Override Set<T> retainAll(Iterable<? extends T> elements); @Override Set<T> scan(T zero, BiFunction<? super T, ? super T, ? extends T> operation); @Override <U> Set<U> scanLeft(U zero, BiFunction<? super U, ? super T, ? extends U> operation); @Override <U> Set<U> scanRight(U zero, BiFunction<? super T, ? super U, ? extends U> operation); @Override Iterator<? extends Set<T>> slideBy(Function<? super T, ?> classifier); @Override Iterator<? extends Set<T>> sliding(int size); @Override Iterator<? extends Set<T>> sliding(int size, int step); @Override Tuple2<? extends Set<T>, ? extends Set<T>> span(Predicate<? super T> predicate); @Override Set<T> tail(); @Override Option<? extends Set<T>> tailOption(); @Override Set<T> take(int n); @Override Set<T> takeRight(int n); @Override Set<T> takeUntil(Predicate<? super T> predicate); @Override Set<T> takeWhile(Predicate<? super T> predicate); @Override <T1, T2> Tuple2<? extends Set<T1>, ? extends Set<T2>> unzip(Function<? super T, Tuple2<? extends T1, ? extends T2>> unzipper); @Override <T1, T2, T3> Tuple3<? extends Set<T1>, ? extends Set<T2>, ? extends Set<T3>> unzip3(Function<? super T, Tuple3<? extends T1, ? extends T2, ? extends T3>> unzipper); @Override <U> Set<Tuple2<T, U>> zip(Iterable<? extends U> that); @Override <U, R> Set<R> zipWith(Iterable<? extends U> that, BiFunction<? super T, ? super U, ? extends R> mapper); @Override <U> Set<Tuple2<T, U>> zipAll(Iterable<? extends U> that, T thisElem, U thatElem); @Override Set<Tuple2<T, Integer>> zipWithIndex(); @Override <U> Set<U> zipWithIndex(BiFunction<? super T, ? super Integer, ? extends U> mapper); }