From 4683b5a19b31a2722a9f0a17522fc0daec9c6801 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Thu, 20 Jan 2022 17:00:00 +0100 Subject: [PATCH] Add transformer function --- src/test.nim | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/test.nim b/src/test.nim index df04b33..4563c2e 100644 --- a/src/test.nim +++ b/src/test.nim @@ -268,6 +268,12 @@ proc merge[T](t: Builder[T], parser: Parser, tree: seq[T]): Builder[T] = tree )) +proc mapTree[T](builder: BuilderResult[T], fn: seq[T] -> seq[T]): BuilderResult[T] = + builder.map(proc(b: Builder[T]): Builder[T] = Builder(( + parser: b[0], + tree: fn(b[1]), + ))) + proc applyParsers[T]( builder: Builder[T], parsers: seq[Parser -> ParserResult], @@ -288,12 +294,13 @@ proc applyParsers[T]( ), ) -proc mapTree[T](builder: BuilderResult[T], fn: seq[T] -> seq[T]): BuilderResult[T] = - builder.map(proc(b: Builder[T]): Builder[T] = Builder(( - parser: b[0], - tree: fn(b[1]), - ))) - +proc applyParsersSeq[T]( + builder: BuilderResult[T], + xs: seq[tuple[ + parsers: seq[Parser -> ParserResult], + tokenFoldFn: (seq[Token], seq[T]) -> seq[T], + ]]): BuilderResult[T] = + xs.foldl(a.flatMap((x: Builder[T]) => x.applyParsers(b[0], b[1])), builder) when isMainModule: let parseHeadingStars = @[ @@ -313,19 +320,24 @@ when isMainModule: return proc(xs: seq[Token], ys: seq[StringBuilderT]): seq[StringBuilderT] = return ys & xs.foldl(a & b.value, typeInfo) - let sampleBuilder: StringBuilderResult = StringBuilderResult + let sampleBuilder = StringBuilderResult .ok(StringBuilder(( parser: initParser("**** Some stars"), tree: newSeq[StringBuilderT](), ))) - .flatMap((x: StringBuilder) => x.applyParsers( - parsers = parseHeadingStars, - tokenFoldFn = stringConcat("Stars: ") - )) - .flatMap((x: StringBuilder) => x.applyParsers( - parsers = parseHeadingText, - tokenFoldFn = stringConcat("Text: ") - )) + .applyParsersSeq(@[ + (parseHeadingStars, stringConcat("Stars: ")), + (parseHeadingText, stringConcat("Text: ")) + ]) + + # .flatMap((x: StringBuilder) => x.applyParsers( + # parsers = parseHeadingStars, + # tokenFoldFn = stringConcat("Stars: ") + # )) + # .flatMap((x: StringBuilder) => x.applyParsers( + # parsers = parseHeadingText, + # tokenFoldFn = stringConcat("Text: ") + # )) echo sampleBuilder