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; } }; } }