diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java index 9f74e10f..a3f74c09 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java @@ -46,20 +46,21 @@ public class CurrentIteration implements ValueExpression { @Override public ImmutableList> eval(final ParseState parseState, final Encoding encoding) { - final BigInteger currentIndex = findCurrentIteration(parseState.order, ZERO).computeResult(); - return ImmutableList.create(Optional.of(createFromNumeric(currentIndex, new Encoding()))); + final ParseGraph iterable = findIterable(parseState.order, ParseGraph.EMPTY).computeResult(); + final BigInteger iteration = countIterable(iterable, ZERO).computeResult().max(ZERO); + return ImmutableList.create(Optional.of(createFromNumeric(iteration, new Encoding()))); } - private Trampoline findCurrentIteration(final ParseItem item, final BigInteger currentIndex) { - if (!item.isGraph()) { return complete(() -> currentIndex); } + private Trampoline findIterable(final ParseItem item, final ParseGraph iterableCandidate) { + if (!item.isGraph()) { return complete(() -> iterableCandidate); } if (item.getDefinition().isIterable()) { - return intermediate(() -> findCurrentIteration(item.asGraph().head, countIterables(item.asGraph(), ZERO).computeResult())); + return intermediate(() -> findIterable(item.asGraph().head, item.asGraph())); } - return intermediate(() -> findCurrentIteration(item.asGraph().head, currentIndex)); + return intermediate(() -> findIterable(item.asGraph().head, iterableCandidate)); } - private Trampoline countIterables(final ParseGraph graph, final BigInteger count) { - if (!graph.isEmpty()) { return intermediate(() -> countIterables(graph.tail, count.add(ONE))); } + private Trampoline countIterable(final ParseGraph graph, final BigInteger count) { + if (!graph.isEmpty()) { return intermediate(() -> countIterable(graph.tail, count.add(ONE))); } return complete(() -> count.subtract(ONE)); }