diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java b/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java index a2bf740b..881e733e 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java @@ -16,11 +16,14 @@ package io.parsingdata.metal.expression.value; +import static io.parsingdata.metal.SafeTrampoline.complete; +import static io.parsingdata.metal.SafeTrampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; import java.util.Objects; import java.util.Optional; +import io.parsingdata.metal.SafeTrampoline; import io.parsingdata.metal.Util; import io.parsingdata.metal.data.ImmutableList; import io.parsingdata.metal.data.ParseGraph; @@ -53,12 +56,12 @@ public ImmutableList> eval(final ParseGraph graph, final Encodin if (base.isEmpty()) { return base; } final ImmutableList> count = this.count.eval(graph, encoding); if (count.size != 1 || !count.head.isPresent()) { throw new IllegalStateException("Count must yield a single non-empty value."); } - return expand(base, count.head.get().asNumeric().intValue(), new ImmutableList<>()); + return expand(base, count.head.get().asNumeric().intValue(), new ImmutableList<>()).computeResult(); } - private ImmutableList> expand(final ImmutableList> base, final int count, final ImmutableList> aggregate) { - if (count < 1) { return aggregate; } - return expand(base, count - 1, aggregate.add(base)); + private SafeTrampoline>> expand(final ImmutableList> base, final int count, final ImmutableList> aggregate) { + if (count < 1) { return complete(() -> aggregate); } + return intermediate(() -> expand(base, count - 1, aggregate.add(base))); } @Override