Add transformer function

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

View File

@@ -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