// TreeSet variant allowing multiple elements which are considered
// equal by the comparator but not by eq().
// could be augmented to implement NavigableSet
sclass TreeSetWithDuplicates implements Iterable {
TreeSet> internal;
Comparator comparator;
*(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) found.add(a);
else internal.add(newSet);
}
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);
}
A first() {
ret main first(main first(internal));
}
public ItIt iterator() {
ret nestedIterator(internal, methodLambda0 iterator);
}
void addAll(Cl extends A> l) {
fOr (A a : l) add(a);
}
}