public ISet union(ISet other) { ShareableValuesHashSet newData; Iterator<IValue> setIterator; Set otherSet = (Set) other; if (otherSet.size() <= size()) { newData = new ShareableValuesHashSet(data); setIterator = otherSet.iterator(); } else { newData = new ShareableValuesHashSet(otherSet.data); setIterator = iterator(); } while (setIterator.hasNext()) { newData.add(setIterator.next()); } Type newElementType = elementType.lub(otherSet.elementType); return new SetWriter(newElementType, newData).done(); }