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())