docs: public static <E> SetView<E> union(final Set<? extends E> set1, final Set<? extends E> set2) {
      checkNotNull(set1, "set1");
      checkNotNull(set2, "set2");
  
      final Set<? extends E> set2minus1 = difference(set2, set1);
  
      return new SetView<E>() {
        @Override
        public int size() {
          return IntMath.saturatedAdd(set1.size(), set2minus1.size());
        }
  
        @Override
        public boolean isEmpty() {
          return set1.isEmpty() && set2.isEmpty();
        }
  
        @Override
        public UnmodifiableIterator<E> iterator() {
          return Iterators.unmodifiableIterator(
              Iterators.concat(set1.iterator(), set2minus1.iterator()));
        }
  
        @Override
        public boolean contains(Object object) {
          return set1.contains(object) || set2.contains(object);
        }
  
        @Override
        public <S extends Set<E>> S copyInto(S set) {
          set.addAll(set1);
          set.addAll(set2);
          return set;
        }
  
        @Override
        public ImmutableSet<E> immutableCopy() {
          return new ImmutableSet.Builder<E>().addAll(set1).addAll(set2).build();
        }
      };
    }