32 lines
880 B
Nim
32 lines
880 B
Nim
import std/sugar
|
|
import std/collections/sequtils
|
|
import results
|
|
import ./parser_types
|
|
|
|
type StringBuilderT* = string
|
|
type StringBuilder* = Builder[StringBuilderT]
|
|
type StringBuilderResult* = BuilderResult[StringBuilderT]
|
|
|
|
proc stringConcat*(typeInfo: StringBuilderT, seperator = ""):
|
|
(seq[ParserToken], seq[StringBuilderT]) -> seq[StringBuilderT] =
|
|
|
|
return proc(xs: seq[ParserToken], ys: seq[StringBuilderT]): seq[StringBuilderT] =
|
|
return ys & xs.foldl(a & b.tokenStringValue() & seperator, typeInfo)
|
|
|
|
proc initStringBuilder*(str: string): StringBuilderResult =
|
|
StringBuilderResult
|
|
.ok(StringBuilder((
|
|
parser: initParser(str),
|
|
tree: newSeq[StringBuilderT](),
|
|
)))
|
|
|
|
proc fold*[T, E, T2](
|
|
self: Result[T, E],
|
|
onError: E -> T2,
|
|
onSuccess: T -> T2,
|
|
): T2 =
|
|
if self.isOk():
|
|
onSuccess(self.unsafeGet())
|
|
else:
|
|
onError(self.error())
|