- if (r.numPop <= 1) continue;
- r.reduce(n, n2, Phase.this, null);
+
+ // UGLY HACK
+ // The problem here is that a "reduction of length 1"
+ // performed twice with different values of n2 needs
+ // to only create a *single* new result, but must add
+ // multiple parents to the node holding that result.
+ // The current reducer doesn't differentiate between
+ // the next node of an n-pop reduction and the
+ // ultimate parent of the last pop, so we need to
+ // cache instances here as a way of avoiding
+ // recreating them.
+
+ // currently we have this weird problem where we
+ // have to do an individual reduct for each child
+ // when the reduction length is one (ie the
+ // children wind up being children of the newly
+ // created node rather than part of the popped
+ // sequence
+ if (r.numPop <= 0) continue;
+ if (r.numPop == 1) {
+ Forest ret = n.cache().get(r);
+ if (ret != null) r.reduce(n, n2, n.phase, ret);
+ else n.cache().put(r, r.reduce(n, n2, n.phase, null));
+ } else {
+ r.reduce(n, n2, Phase.this, null);
+ }