// TreeSet variant allowing multiple elements which are considered // equal by the comparator but not by eq(). // could be augmented to implement NavigableSet. // All operations O(log n) with n being the number of _different_ elements. sclass TreeSetWithDuplicates implements Iterable { TreeSet> internal; Comparator comparator; int size; *(Comparator *comparator) { internal = new TreeSet>((setA, setB) -> { ret comparator.compare(main first(setA), main first(setB)); }); } swappable Set makeInternalSet() { ret new HashSet; } void add(A a) { Set newSet = addAndReturnCollection(makeInternalSet(), a); Set found = navigableSet_find(internal, newSet); if (found != null) { if (!found.add(a)) ret; } else internal.add(newSet); ++size; } void remove(A a) { Set newSet = addAndReturnCollection(makeInternalSet(), a); Set found = navigableSet_find(internal, newSet); if (found == null) ret; found.remove(a); if (empty(found)) internal.remove(found); --size; } A first() { ret main first(main first(internal)); } public ItIt iterator() { ret nestedIterator(internal, methodLambda0 iterator); } void addAll(Cl l) { fOr (A a : l) add(a); } public int size() { ret size; } // may return null Set tiedForFirst() { ret first(internal); } }