class TreeMap extends AStruct { private static final String[] NAMES = {"add", "contains", "find", "iter", "remove"}; private final int height; private final TreeMap left; private final TreeMap right; private final Object key; private final Object value; private final Fun less; private TreeMap(TreeMap l, TreeMap r, Object k, Object v, Fun cmp) { super(NAMES, null); left = l; right = r; key = k; value = v; height = l == null ? 0 : (l.height > r.height ? l.height : r.height) + 1; less = cmp; } private static TreeMap balance(TreeMap left, TreeMap right, Object k, Object v, Fun cmp) { if (left.height > right.height + 2) { TreeMap l = left.left, r = left.right; if (l.height >= r.height) return new TreeMap(l, new TreeMap(r, right, k, v, cmp), left.key, left.value, cmp); return new TreeMap( new TreeMap(l, r.left, left.key, left.value, cmp), new TreeMap(r.right, right, k, v, cmp), r.key, r.value, cmp); } if (right.height > left.height + 2) { TreeMap l = right.left, r = right.right; if (r.height >= l.height) return new TreeMap(new TreeMap(left, l, k, v, cmp), r, right.key, right.value, cmp); return new TreeMap( new TreeMap(left, l.left, k, v, cmp), new TreeMap(l.right, r, right.key, right.value, cmp), l.key, l.value, cmp); } return new TreeMap(left, right, k, v, cmp); } private static TreeMap add(TreeMap t, Object k, Object v) { if (t.height <= 0) return new TreeMap(t, t, k, v); int c = ((Number) t.cmp.apply(k, t.key)).intValue(); if (c == 0) return new TreeMap(t.left, t.right, k, v, t.lt); if (c < 0) return balance(add(t.left, k, v), t.right, t.key, t.value, t.lt); return balance(t.left, add(t.right, k, v), t.key, t.value, t.lt); } Object get(String field) { } Object get(int field) { switch (field) { case 0: // add return new Fun2() { Object apply(Object k, Object v) { return add(TreeMap.this, k, v); } }; } return null; } }