diff --git a/src/test.nim b/src/test.nim index 04d1ec1..7b59e01 100644 --- a/src/test.nim +++ b/src/test.nim @@ -11,10 +11,6 @@ import print {.experimental: "caseStmtMacros".} type - ParsePosition = tuple - column, line, currentLine: int - atNewLine: bool - ParseError = tuple unexpected: string expected: seq[string] @@ -31,9 +27,13 @@ type Parser* = ref object state: ParserState tokens: seq[Token] - ParserResult* = Result[Parser, (Parser, string)] + # Builder[T]* = ref object + # parser: ParserResult, + # tree: seq[T], + # BuilderResult* = Result[Builder, (Builder, string)] + func getOrElse*[T, E](self: Result[T, E], otherwise: T): T = if self.isOk(): self.v @@ -114,6 +114,26 @@ func str(s: string): (Parser -> ParserResult) {.inline.} = p = p.flatMap(ch(c)) return p +# proc foldTokens[T]( +# parserResult: ParserResult, +# builderResult: BuilderResult[T], +# fn: Parser -> T, +# ): BuilderResult[T] = +# builderResult.flatMap((b: Builder) => Builder( +# parser: parserResult, +# tree: parserResul +# )) + +proc foldTokens[T]( + parserResult: ParserResult, + onError: T, + onSuccess: seq[Token] -> T, +): T = + if parserResult.isOk(): + onSuccess(parserResult.unsafeGet().tokens) + else: + onError + # onError(parserResult.error) when isMainModule: let fooParser = initParser("FOO_BAR") @@ -124,5 +144,9 @@ when isMainModule: ch('A'), ch('R'), ]) + .foldTokens( + "Error", + xs => xs.foldl(a & b.value, "") + ) echo fooParser