Add transformer function
This commit is contained in:
42
src/test.nim
42
src/test.nim
@@ -268,6 +268,12 @@ proc merge[T](t: Builder[T], parser: Parser, tree: seq[T]): Builder[T] =
|
|||||||
tree
|
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](
|
proc applyParsers[T](
|
||||||
builder: Builder[T],
|
builder: Builder[T],
|
||||||
parsers: seq[Parser -> ParserResult],
|
parsers: seq[Parser -> ParserResult],
|
||||||
@@ -288,12 +294,13 @@ proc applyParsers[T](
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
proc mapTree[T](builder: BuilderResult[T], fn: seq[T] -> seq[T]): BuilderResult[T] =
|
proc applyParsersSeq[T](
|
||||||
builder.map(proc(b: Builder[T]): Builder[T] = Builder((
|
builder: BuilderResult[T],
|
||||||
parser: b[0],
|
xs: seq[tuple[
|
||||||
tree: fn(b[1]),
|
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:
|
when isMainModule:
|
||||||
let parseHeadingStars = @[
|
let parseHeadingStars = @[
|
||||||
@@ -313,19 +320,24 @@ when isMainModule:
|
|||||||
return proc(xs: seq[Token], ys: seq[StringBuilderT]): seq[StringBuilderT] =
|
return proc(xs: seq[Token], ys: seq[StringBuilderT]): seq[StringBuilderT] =
|
||||||
return ys & xs.foldl(a & b.value, typeInfo)
|
return ys & xs.foldl(a & b.value, typeInfo)
|
||||||
|
|
||||||
let sampleBuilder: StringBuilderResult = StringBuilderResult
|
let sampleBuilder = StringBuilderResult
|
||||||
.ok(StringBuilder((
|
.ok(StringBuilder((
|
||||||
parser: initParser("**** Some stars"),
|
parser: initParser("**** Some stars"),
|
||||||
tree: newSeq[StringBuilderT](),
|
tree: newSeq[StringBuilderT](),
|
||||||
)))
|
)))
|
||||||
.flatMap((x: StringBuilder) => x.applyParsers(
|
.applyParsersSeq(@[
|
||||||
parsers = parseHeadingStars,
|
(parseHeadingStars, stringConcat("Stars: ")),
|
||||||
tokenFoldFn = stringConcat("Stars: ")
|
(parseHeadingText, stringConcat("Text: "))
|
||||||
))
|
])
|
||||||
.flatMap((x: StringBuilder) => x.applyParsers(
|
|
||||||
parsers = parseHeadingText,
|
# .flatMap((x: StringBuilder) => x.applyParsers(
|
||||||
tokenFoldFn = stringConcat("Text: ")
|
# parsers = parseHeadingStars,
|
||||||
))
|
# tokenFoldFn = stringConcat("Stars: ")
|
||||||
|
# ))
|
||||||
|
# .flatMap((x: StringBuilder) => x.applyParsers(
|
||||||
|
# parsers = parseHeadingText,
|
||||||
|
# tokenFoldFn = stringConcat("Text: ")
|
||||||
|
# ))
|
||||||
|
|
||||||
|
|
||||||
echo sampleBuilder
|
echo sampleBuilder
|
||||||
|
|||||||
Reference in New Issue
Block a user