From 32ff2eeece956254cb8d3bb60f7d1526571ac28c Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Sun, 26 Feb 2017 08:24:02 -0500 Subject: Update --- .../bjc/utils/data/TopDownTransformIterator.java | 79 +++++++++++++++------- 1 file changed, 55 insertions(+), 24 deletions(-) (limited to 'BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java b/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java index 4c5ec8a..d37123f 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java +++ b/BJC-Utils2/src/main/java/bjc/utils/data/TopDownTransformIterator.java @@ -58,9 +58,48 @@ public class TopDownTransformIterator implements Iterator flushYields(ITree val) { + if(curYield != null) { + toYield.add(new SingleIterator<>(val)); + + if(curYield.hasNext()) { + return curYield.next(); + } else { + while(toYield.size() != 0 && !curYield.hasNext()) { + curYield = toYield.pop(); + } + + if(toYield.size() == 0 && !curYield.hasNext()) { + curYield = null; + return val; + } else { + return curYield.next(); + } + } + } else { + return val; + } + } + public ITree next() { if(done) throw new NoSuchElementException(); + if(curYield != null) { + if(curYield.hasNext()) { + return curYield.next(); + } else { + while(toYield.size() != 0 && !curYield.hasNext()) { + curYield = toYield.pop(); + } + + if(toYield.size() == 0 && !curYield.hasNext()) { + curYield = null; + } else { + return curYield.next(); + } + } + } + if(initial) { TopDownTransformResult res = picker.apply(preParent.getHead()); @@ -77,17 +116,17 @@ public class TopDownTransformIterator implements Iterator implements Iterator(preParent.getHead()), this::addYield); + return flushYields(transform.apply(new Tree<>(preParent.getHead()), this::addYield)); } case PULLUP: ITree intRes = transform.apply(preParent, this::addYield); @@ -114,7 +153,7 @@ public class TopDownTransformIterator implements Iterator implements Iterator(picker, transform, preChildren.pop()); ITree res = curChild.next(); + System.out.println("\t\tTRACE: adding node " + res + " to children"); postChildren.add(res); - return res; + return flushYields(res); } else { ITree res = null; if(postParent == null) { res = new Tree<>(preParent.getHead()); + System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res); + for(ITree child : postChildren) { res.addChild(child); } - - res = transform.apply(res, this::addYield); + + // res = transform.apply(res, this::addYield); } else { res = postParent; + System.out.println("\t\tTRACE: adding nodes " + postChildren + " to " + res); for(ITree child : postChildren) { res.addChild(child); } } done = true; - return res; + return flushYields(res); } } else { ITree res = curChild.next(); + System.out.println("\t\tTRACE: adding node " + res + " to children"); postChildren.add(res); - return res; + return flushYields(res); } } } -- cgit v1.2.3