Add fold fn for builder

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent 4683b5a19b
commit 5863304456

View File

@@ -302,6 +302,17 @@ proc applyParsersSeq[T](
]]): BuilderResult[T] =
xs.foldl(a.flatMap((x: Builder[T]) => x.applyParsers(b[0], b[1])), builder)
proc foldBuilder[T, T2](
builderResult: BuilderResult[T],
onError: string -> T2,
onSuccess: seq[T] -> T2,
): T =
if builderResult.isOk():
onSuccess(builderResult.unsafeGet().tree)
else:
let err = builderResult.error()
onError(err[1])
when isMainModule:
let parseHeadingStars = @[
manyUntil(ch('*'), ch(' ')),
@@ -329,15 +340,9 @@ when isMainModule:
(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: ")
# ))
.foldBuilder(
err => &"Error Parsing: {err}",
xs => "Parser Succesfull:\n" & xs.join("\n"),
)
echo sampleBuilder