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 1e9b5ebd..34fff92d 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 @@ -22,7 +22,6 @@ import static io.parsingdata.metal.expression.value.NotAValue.NOT_A_VALUE; import java.util.Objects; -import java.util.Optional; import io.parsingdata.metal.Trampoline; import io.parsingdata.metal.Util; @@ -40,7 +39,7 @@ * of the result of evaluating bases are concatenated. The amount * of copies equals the result of evaluating count. If * count evaluated to an empty value or NOT_A_VALUE, - * an IllegalArgumentException is thrown. + * an {@link IllegalArgumentException} is thrown. */ public class Expand implements ValueExpression { @@ -58,11 +57,10 @@ public ImmutableList eval(final ParseState parseState, final Encoding enc if (baseList.isEmpty()) { return baseList; } - final Optional countValue = count.evalSingle(parseState, encoding); - if (!countValue.isPresent() || countValue.get().equals(NOT_A_VALUE)) { - throw new IllegalArgumentException("Count must evaluate to a non-empty countable value."); - } - return expand(baseList, countValue.get().asNumeric().intValueExact(), new ImmutableList<>()).computeResult(); + return count.evalSingle(parseState, encoding) + .filter(countValue -> !countValue.equals(NOT_A_VALUE)) + .map(countValue -> expand(baseList, countValue.asNumeric().intValueExact(), new ImmutableList<>()).computeResult()) + .orElseThrow(() -> new IllegalArgumentException("Count must evaluate to a non-empty countable value.")); } private Trampoline> expand(final ImmutableList baseList, final int countValue, final ImmutableList aggregate) { diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/SingleValueExpression.java b/core/src/main/java/io/parsingdata/metal/expression/value/SingleValueExpression.java index 0bdfc5bd..51f67681 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/SingleValueExpression.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/SingleValueExpression.java @@ -26,7 +26,7 @@ * Interface for all SingleValueExpression implementations. *

* A SingleValueExpression is an expression that is evaluated by executing its - * {@link #eval(ParseState, Encoding)} method. It yields an {@link Optional} + * {@link #evalSingle(ParseState, Encoding)} method. It yields an {@link Optional} * {@link Value} object. *

* As context, it receives the current ParseState object as diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java index e9f5ff41..51679a52 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java @@ -33,6 +33,7 @@ import io.parsingdata.metal.data.ImmutableList; import io.parsingdata.metal.data.ParseState; import io.parsingdata.metal.encoding.Encoding; +import io.parsingdata.metal.expression.value.NotAValue; import io.parsingdata.metal.expression.value.Value; import io.parsingdata.metal.expression.value.ValueExpression; @@ -43,8 +44,8 @@ * indices (both {@link ValueExpression}s). Both operands are * evaluated. Next, the resulting values of evaluating indices is * used as a list of integer indices into the results of evaluating - * values. For every invalid index (NOT_A_VALUE, a - * negative value or an index that is out of bounds) NOT_A_VALUE + * values. For every invalid index ({@link NotAValue#NOT_A_VALUE}, a + * negative value or an index that is out of bounds) {@link NotAValue#NOT_A_VALUE} * is returned. */ public class Nth implements ValueExpression { diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java index 8d5daca9..b4f5c392 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java @@ -16,6 +16,8 @@ package io.parsingdata.metal.expression.value.reference; +import static java.util.function.Function.identity; + import java.util.Optional; import io.parsingdata.metal.Util; @@ -32,7 +34,7 @@ public class Self implements SingleValueExpression { @Override public Optional evalSingle(final ParseState parseState, final Encoding encoding) { - return parseState.order.current().flatMap(Optional::of); + return parseState.order.current().map(identity()); } @Override diff --git a/core/src/main/java/io/parsingdata/metal/token/RepN.java b/core/src/main/java/io/parsingdata/metal/token/RepN.java index 65ec83b9..482bfd63 100644 --- a/core/src/main/java/io/parsingdata/metal/token/RepN.java +++ b/core/src/main/java/io/parsingdata/metal/token/RepN.java @@ -55,7 +55,7 @@ protected Optional parseImpl(final Environment environment) { .filter(count -> !count.equals(NOT_A_VALUE)) .flatMap(count -> parse(environment, env -> env.parseState.iterations.head.right.compareTo(count.asNumeric()) >= 0, env -> failure())); } - + @Override public String toString() { return getClass().getSimpleName() + "(" + makeNameFragment() + token + "," + n + ")";