- private HashSet<E> left = new HashSet<E>();
- private HashSet<E> right = new HashSet<E>();
- public BindingGroup() { }
- public BindingGroup(E e) { add(null, e, false); }
- public void add(E ethis, E e, boolean swap) {
- if (ethis==null) { }
- else if (right.contains(ethis)) swap = !swap;
- else if (!left.contains(ethis)) throw new Error();
-
- if (e.bg != null) {
- if (e.bg == this) {
- if ((!swap ? right : left).contains(e)) throw new Error("double bind!");
- return;
+ private HashSet<E> set = new HashSet<E>();
+ public BindingGroup bind_others;
+ public BindingGroup other() { return bind_others; }
+ public BindingGroup(BindingGroup bind_others) { this.bind_others = bind_others; }
+ public BindingGroup() { this.bind_others = new BindingGroup(this); }
+ public BindingGroup(E e) { this(); set.add(e); }
+ public void add(E e) {
+ if (set.contains(e)) return;
+ set.add(e);
+ BindingGroup e_bind_peers = e.bind_peers;
+ BindingGroup e_bind_to = e.bind_to;
+ e.bind_peers = this;
+ e.bind_to = bind_others;
+ for (E epeer : e_bind_peers.set) add(epeer);
+ for (E eother : e_bind_to.set) bind_others.add(eother);
+
+ for(E eother : bind_others.set) {
+ if (e.next.bind_to.set.contains(eother.prev)) {
+ e.next.next.bindEdge(eother.prev.prev);