"A collection in which each distinct element occurs at most once. Two non-[[identical|Identifiable]] values are considered distinct only if they are unequal, according to their own definition of [[value equality|Object.equals]]. A `Set` is a [[Collection]] of its elements. Sets may not have [[null|Null]] elements. A new `Set` may be obtained by calling the function [[set]]. value words = set { \"hello\", \"world\" }; value greetings = set { \"hello\", \"goodbye\", \"hola\", \"adios\" }; The [[emptySet]] is a `Set` with no elements. Sets may be the subject of the binary union, intersection, and complement operators `|`, `&`, and `~`. value greetingsInWords = words & greetings; value allWords = words | greetings; An implementation of `Set` may compare elements for equality using [[Object.equals]] or [[Comparable.compare]]." tagged("Collections") see (`function package.set`, `value emptySet`) shared interface Set<out Element=Object> satisfies Collection<Element> given Element satisfies Object { "The fundamental operation for `Set`s. Determines if the given value belongs to this set." shared actual default Boolean contains(Object element) => super.contains(element); "A shallow copy of this set, that is, a set with the same elements as this set, which do not change if the elements of this set change." shared actual default Set<Element> clone() => package.set(this); "Determines if this set is a superset of the given `Set`, that is, if this set contains all of the elements in the given set." shared default Boolean superset(Set<> set) { for (element in set) { if (!contains(element)) { return false; } } else { return true; } } "Determines if this set is a subset of the given `Set`, that is, if the given set contains all of the elements in this set." shared default Boolean subset(Set<> set) { for (element in this) { if (!element in set) { return false; } } else { return true; } } distinct => this; shared actual {Element*} defaultNullElements<Default>(Default defaultValue) given Default satisfies Object => this; "Returns a new `Set` containing all the elements of this set and all the elements of the given `Set`. For example: set { \"hello\", \"world\" } | set { 1, 2, \"hello\" } Produces the set `{ \"hello\", \"world\", 1, 2 }` of type `Set<String|Integer>`. Note that it is possible for two sets of disjoint element type to be considered to have elements in common. For example, since \`1==1.0\` [[evaluates to true|Integer.equals]], the expression set { 1 } | set { 1.0 } produces the set `{ 1 }`." shared default Set<Element|Other> union<Other>(Set<Other> set) given Other satisfies Object => package.set(chain(set)); "Returns a new `Set` containing only the elements that are present in both this set and the given `Set` and that are instances of the intersection `Element&Other` of the element types of the two sets. For example: set { \"hello\", \"world\" } & set { 1, 2, \"hello\" } Produces the set `{ \"hello\" }` of type `Set<String>`. Note that, according to this definition, and even though `1==1.0` [[evaluates to true|Integer.equals]], the expression set { 1 } & set { 1.0 } produces the empty set `{}`." shared default Set<Element&Other> intersection<Other>(Set<Other> set) given Other satisfies Object => package.set(filter((e) => e in set) .narrow<Other>()); "Returns a new `Set` containing all the elements in this set that are not contained in the given `Set`. For example: set { \"hello\", \"world\" } ~ set { 1, 2, \"hello\" } Produces the set `{ \"world\" }` of type `Set<String>`." shared default Set<Element> complement<Other>(Set<Other> set) given Other satisfies Object => package.set(filter((e) => !e in set)); "Returns a new `Set` containing only the elements contained in either this set or the given `Set`, but no element contained in both sets." shared default Set<Element|Other> exclusiveUnion<Other>(Set<Other> set) given Other satisfies Object => package.set(filter((e) => !e in set) .chain(set.filter((e) => !e in this))); "Two `Set`s are considered equal if they have the same size and if every element of the first set is also an element of the second set, as determined by [[contains]]. Equivalently, a set is equal to a second set if it is both a subset and a superset of the second set." shared actual default Boolean equals(Object that) { if (is Set<> that, that.size==size) { for (element in this) { if (!element in that) { return false; } } else { return true; } } return false; } shared actual default Integer hash { variable Integer hashCode = 0; for (elem in this) { hashCode += elem.hash; } return hashCode; } } "Create a new immutable [[Set]] containing every element produced by the given [[stream]], resolving items with duplicate keys according to the given [[function|choosing]]. For example: set { 0, 1, 1, 2, 3, 3, 3 } produces the set `{ 0, 1, 2, 3 }`. This is an eager operation and the resulting set does not reflect changes to the given [[stream]]." see(`value Iterable.distinct`) since("1.2.0") shared Set<Element> set<Element>( "The stream of elements." {Element*} stream, "A function that chooses between duplicate elements. By default, the element that occurs _earlier_ in the stream is chosen." Element choosing(Element earlier, Element later) => earlier) given Element satisfies Object => IterableSet(stream, choosing); class IterableSet<Element>( {Element*} stream, Element choosing(Element earlier, Element later)) extends Object() satisfies Set<Element> given Element satisfies Object { value elements = stream.summarize(identity, (Element? current, element) => if (exists current) then choosing(current, element) else element); contains(Object element) => elements.defines(element); iterator() => elements.keys.iterator(); size => elements.size; empty => elements.empty; clone() => this; } "An immutable [[Set]] with no elements." tagged("Collections") shared object emptySet extends Object() satisfies Set<Nothing> { shared actual Set<Other> union<Other>(Set<Other> set) given Other satisfies Object => set; shared actual Set<Nothing> intersection<Other>(Set<Other> set) given Other satisfies Object => this; shared actual Set<Other> exclusiveUnion<Other>(Set<Other> set) given Other satisfies Object => set; shared actual Set<Nothing> complement<Other>(Set<Other> set) given Other satisfies Object => this; subset(Set<> set) => true; superset(Set<> set) => set.empty; clone() => this; iterator() => emptyIterator; size => 0; empty => true; contains(Object element) => false; containsAny({Object*} elements) => false; containsEvery({Object*} elements) => false; count(Boolean selecting(Nothing element)) => 0; any(Boolean selecting(Nothing element)) => false; every(Boolean selecting(Nothing element)) => true; shared actual Null find(Boolean selecting(Nothing element)) => null; shared actual Null findLast(Boolean selecting(Nothing element)) => null; skip(Integer skipping) => this; take(Integer taking) => this; by(Integer step) => this; shared actual void each(void step(Nothing element)) {} }