In Mathematics, two sets can be “added” together. The **union** of $A$ and $B$, denoted by $A \cup B$, is the set of all elements that are members of either $A$ or $B$.

We can include this operation in the Set ADT:

```
/**
* Constructing a new set with elements that are in this set or
* in the other set.
*
* @param other set.
* @return all elements that are in this set or the other set.
*/
Set<T> union(Set<T> other);
```

The **intersection** of $A$ and $B$, denoted by $A \cap B$, is the set of all elements that are members of both $A$ and $B$.

```
/**
* Constructing a new set with elements that are in this set and
* in the other set.
*
* @param other set.
* @return the elements this set and other set have in common.
*/
Set<T> intersect(Set<T> other);
```

The **set difference** of $A$ and $B$, denoted by $A - B$, is the set of all elements that are in $A$ but not in $B$.

```
/**
* Constructing a new set with elements that are in this set but not
* in the other set.
*
* @param other set.
* @return the elements in this set but not in the other set.
*/
Set<T> subtract(Set<T> other);
```

These operations can be defined for OrderedSet ADT as well:

```
OrderedSet<T> union(OrderedSet<T> other);
OrderedSet<T> intersect(OrderedSet<T> other);
OrderedSet<T> subtract(OrderedSet<T> other);
```

We leave it to you as a *challenge>* exercise to implement these operations *efficiently*.