sclass BetterLinkedHashSet extends AbstractSet {
Map> entries = hashMap();
Entry head, tail;
sclass Entry {
A value;
Entry prev, next;
}
public bool add(A a) {
if (entries.containsKey(a)) false;
new Entry n;
n.value = a;
n.prev = tail;
if (tail != null) tail.next = n;
tail = n;
entries.put(a, n);
true;
}
public bool remove(A a) {
ret remove(entries.get(a));
}
public bool remove(Entry node) {
if (node == null) false;
if (node.next != null) node.next.prev = node.prev; else tail = node.prev;
if (node.prev != null) node.prev.next = node.next;
entries.remove(node.value);
true;
}
public int size() { ret entries.size(); }
public ItIt iterator() {
ret new ItIt {
Entry entry = head;
public bool hasNext() { ret entry != null; }
public A next() {
A a = entry.value;
entry = entry.next;
ret a;
}
};
}
}