summaryrefslogtreecommitdiff
path: root/JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java
diff options
context:
space:
mode:
Diffstat (limited to 'JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java')
-rw-r--r--JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java63
1 files changed, 63 insertions, 0 deletions
diff --git a/JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java b/JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java
new file mode 100644
index 0000000..1aeabdb
--- /dev/null
+++ b/JPratt/src/main/java/com/ashardalon/pratt/blocks/TriggeredParseBlock.java
@@ -0,0 +1,63 @@
+package com.ashardalon.pratt.blocks;
+
+import java.util.function.UnaryOperator;
+
+import com.ashardalon.pratt.ParserContext;
+import com.ashardalon.pratt.commands.CommandResult;
+import com.ashardalon.pratt.commands.CommandResult.Status;
+
+import bjc.utils.parserutils.ParserException;
+
+/**
+ * A parse block that can adjust the state before handling its context.
+ *
+ * @author bjculkin
+ *
+ * @param <K>
+ * The key type of the tokens.
+ * @param <V>
+ * The value type of the tokens.
+ * @param <C>
+ * The state type of the parser.
+ */
+public class TriggeredParseBlock<K, V, C> implements ParseBlock<K, V, C> {
+ private final UnaryOperator<C> onEntr;
+ private final UnaryOperator<C> onExt;
+
+ private final ParseBlock<K, V, C> sourc;
+
+ /**
+ * Create a new triggered parse block.
+ *
+ * @param onEnter
+ * The action to fire before parsing the block.
+ *
+ * @param onExit
+ * The action to fire after parsing the block.
+ *
+ * @param source
+ * The block to use for parsing.
+ */
+ public TriggeredParseBlock(final UnaryOperator<C> onEnter, final UnaryOperator<C> onExit,
+ final ParseBlock<K, V, C> source) {
+ onEntr = onEnter;
+ onExt = onExit;
+ sourc = source;
+ }
+
+ @Override
+ public CommandResult<K, V> parse(final ParserContext<K, V, C> ctx) throws ParserException {
+ final C newState = onEntr.apply(ctx.state);
+
+ final ParserContext<K, V, C> newCtx = new ParserContext<>(ctx.tokens, ctx.parse, newState);
+
+ final CommandResult<K,V> res = sourc.parse(newCtx);
+
+ if (res.status != Status.SUCCESS) return res;
+
+ ctx.state = onExt.apply(newState);
+
+ return res;
+ }
+
+}