diff --git a/src/test.nim b/src/test.nim index 7aeaf2f..5c7af54 100644 --- a/src/test.nim +++ b/src/test.nim @@ -67,30 +67,46 @@ proc initParser(str: string): ParserResult = tokens: newSeq[Token](), ).ok() -proc ch(parser: Parser, c: char): ParserResult = - let state = parser.state +func ch(c1: char): (Parser -> ParserResult) {.inline.} = + return func(parser: Parser): ParserResult = + let state = parser.state + let c2 = state.stream[state.position] - if state.stream[0] == c: - Parser( - state: ParserState( - stream: state.stream[1 .. ^1], - position: parser.state.position + 1, - lastPosition: parser.state.position, - ), - tokens: parser.tokens & Token(value: c) - ).ok() - else: - err((parser, &"Expected {c}")) + if c1 == c2: + return Parser( + state: ParserState( + stream: state.stream, + position: state.lastPosition + 1, + lastPosition: parser.state.position, + ), + tokens: parser.tokens & Token(value: c2) + ).ok() + else: + return err((parser, &"Expected {c2} at {state.lastPosition}, got {c1}")) + + +proc parseSeq(parser: ParserResult, xs: seq[Parser -> ParserResult]): ParserResult = + xs.foldl(a.flatMap(b), parser) # type R = Result[int, string] # echo R.ok 4 +let fooParser = initParser("FOO").parseSeq(@[ + ch('F'), + ch('O'), + ch('O'), +]) -echo initParser("Foo") - .flatMap((x: Parser) => ch(x, c = 'F')) - .flatMap((x: Parser) => ch(x, c = 'o')) - .flatMap((x: Parser) => ch(x, c = 'o')) +echo fooParser + + +# echo initParser("FUo") +# .flatMap(ch('F')) +# .flatMap(ch('o')) +# .flatMap(ch('o')) + # .flatMap((x: Parser) => ch(x, c = 'o')) + # .flatMap((x: Parser) => ch(x, c = 'o')) # proc parseStars