Add fold fn for builder
This commit is contained in:
25
src/test.nim
25
src/test.nim
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user