summaryrefslogtreecommitdiff
path: root/src/parser/utils.ts
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2022-01-13 21:20:23 +0530
committerAkshay Nair <phenax5@gmail.com>2022-01-13 21:20:23 +0530
commit016821207f1f2294dd09935a4c1d14d78ff3aed1 (patch)
treef5f852cb94be77ceb5a97a0b6d62cb323090b00b /src/parser/utils.ts
parente26086fef3cf142cffd145836a4c7c12cfeb9656 (diff)
downloadelxr-016821207f1f2294dd09935a4c1d14d78ff3aed1.tar.gz
elxr-016821207f1f2294dd09935a4c1d14d78ff3aed1.zip
refactor(parser): reimplements alt parser
Diffstat (limited to '')
-rw-r--r--src/parser/utils.ts17
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),