From 016821207f1f2294dd09935a4c1d14d78ff3aed1 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Thu, 13 Jan 2022 21:20:23 +0530 Subject: refactor(parser): reimplements alt parser --- src/parser/utils.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/parser/utils.ts') diff --git a/src/parser/utils.ts b/src/parser/utils.ts index 908405e..cee1de7 100644 --- a/src/parser/utils.ts +++ b/src/parser/utils.ts @@ -1,4 +1,4 @@ -import { constant, flow, pipe } from 'fp-ts/function' +import { flow, pipe } from 'fp-ts/function' import { Either, left, @@ -9,9 +9,10 @@ import { fold, orElseW, } from 'fp-ts/Either' -import { none, some, Option } from 'fp-ts/Option' +import { none, some, Option, getOrElse } from 'fp-ts/Option' import { fst, mapFst, mapSnd, snd } from 'fp-ts/Tuple' import { eq } from '../utils' +import { prepend } from 'fp-ts/lib/Array' export type char = string @@ -25,11 +26,19 @@ export const constP = (inp: string) => right([v, inp]) +export const sepBy1 = (sep: Parser, parser: Parser): Parser => + flow( + parser, + chain(([val, nextInput]) => + pipe(nextInput, many0(prefixed(sep, parser)), map(mapFst(prepend(val)))), + ), + ) + export const many0 = (parser: Parser): Parser> => flow( parser, chain(([a, nextInput]) => - pipe(nextInput, many0(parser), map(mapFst(ls => [a, ...ls]))), + pipe(nextInput, many0(parser), map(mapFst(prepend(a)))), ), orElse( flow( @@ -134,7 +143,7 @@ export const andThen = export const optional = (p: Parser): Parser> => flow( - p, + recoverInput(p), fold( flow( mapFst(_ => none), -- cgit v1.3.1