diff options
| author | Akshay Nair <phenax5@gmail.com> | 2022-01-13 21:20:23 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2022-01-13 21:20:23 +0530 |
| commit | 016821207f1f2294dd09935a4c1d14d78ff3aed1 (patch) | |
| tree | f5f852cb94be77ceb5a97a0b6d62cb323090b00b /src/parser/utils.ts | |
| parent | e26086fef3cf142cffd145836a4c7c12cfeb9656 (diff) | |
| download | elxr-016821207f1f2294dd09935a4c1d14d78ff3aed1.tar.gz elxr-016821207f1f2294dd09935a4c1d14d78ff3aed1.zip | |
refactor(parser): reimplements alt parser
Diffstat (limited to '')
| -rw-r--r-- | src/parser/utils.ts | 17 |
1 files changed, 13 insertions, 4 deletions
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 = <T>(sep: Parser<any>, parser: Parser<T>): Parser<T[]> => + flow( + parser, + chain(([val, nextInput]) => + pipe(nextInput, many0(prefixed(sep, parser)), map(mapFst(prepend(val)))), + ), + ) + export const many0 = <T>(parser: Parser<T>): Parser<Array<T>> => 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 = <T>(p: Parser<T>): Parser<Option<T>> => flow( - p, + recoverInput(p), fold( flow( mapFst(_ => none), |
