Index: packages/petitparser/lib/src/debug/continuation.dart |
diff --git a/packages/petitparser/lib/src/debug/continuation.dart b/packages/petitparser/lib/src/debug/continuation.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b673bd916178d5599cf33908949d53491bf65344 |
--- /dev/null |
+++ b/packages/petitparser/lib/src/debug/continuation.dart |
@@ -0,0 +1,38 @@ |
+part of petitparser.debug; |
+ |
+/// Handler function for the [ContinuationParser]. |
+typedef Result ContinuationHandler( |
+ Result continuation(Context context), Context context); |
+ |
+/// Continuation parser that when activated captures a continuation function |
+/// and passes it together with the current context into the handler. |
+/// |
+/// Handlers are not required to call the continuation, but can completely ignore |
+/// it, call it multiple times, and/or store it away for later use. Similarly |
+/// handlers can modify the current context and/or modify the returned result. |
+/// |
+/// The following example shows a simple wrapper. Messages are printed before and |
+/// after the `digit()` parser is activated: |
+/// |
+/// var wrapped = digit(); |
+/// var parser = new ContinuationParser(wrapped, (continuation, context) { |
+/// print('Parser will be activated, the context is $context.'); |
+/// var result = continuation(context); |
+/// print('Parser was activated, the result is $result.'); |
+/// return result; |
+/// }); |
+/// |
+/// See [profile], [progress], and [trace] for more elaborate examples. |
+class ContinuationParser extends DelegateParser { |
+ final ContinuationHandler handler; |
+ |
+ ContinuationParser(parser, this.handler) : super(parser); |
+ |
+ @override |
+ Result parseOn(Context context) { |
+ return handler((result) => super.parseOn(result), context); |
+ } |
+ |
+ @override |
+ Parser copy() => new ContinuationParser(children[0], handler); |
+} |