aboutsummaryrefslogtreecommitdiff
path: root/src/utils/parser-comb.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/parser-comb.ts')
-rw-r--r--src/utils/parser-comb.ts23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/utils/parser-comb.ts b/src/utils/parser-comb.ts
index 9cea86f..49f633e 100644
--- a/src/utils/parser-comb.ts
+++ b/src/utils/parser-comb.ts
@@ -17,12 +17,14 @@ export type ParseResult<T> = Result<{ value: T, input: string }, { error: string
export type Parser<T> = (input: string) => ParseResult<T>;
export const regex = (re: RegExp): Parser<string> => input => {
+ if (input.length === 0) return Result.Err({ error: 'fuckedinput', input })
const res = input.match(re)
if (!res) return Result.Err({ error: 'fucked', input });
return Result.Ok({ value: res[0], input: input.replace(re, '') });
}
export const string = (str: string): Parser<string> => input => {
+ if (input.length === 0) return Result.Err({ error: 'fuckedinput', input })
if (!input.startsWith(str)) return Result.Err({ error: 'fuckedstring', input })
return Result.Ok({ value: str, input: input.slice(str.length) });
}
@@ -61,3 +63,24 @@ export const suffixed = <A>(parser: Parser<A>, parserSuffix: Parser<any>): Parse
export const between = <A>(prefix: Parser<any>, parser: Parser<A>, suffix: Parser<any>): Parser<A> =>
suffixed(prefixed(prefix, parser), suffix)
+export const many0 = <A>(parser: Parser<A>): Parser<Array<A>> => originalInput =>
+ match(parser(originalInput), {
+ Ok: ({ value, input }) => map(many0(parser), ls => [value, ...ls])(input),
+ Err: ({ input }) => Result.Ok({ value: [], input }),
+ })
+
+export const many1 = <A>(parser: Parser<A>): Parser<Array<A>> => originalInput =>
+ match(parser(originalInput), {
+ Ok: ({ value, input }) => map(many0(parser), ls => [value, ...ls])(input),
+ Err: err => Result.Err(err),
+ })
+
+export const sepBy = <A>(parser: Parser<A>, sepP: Parser<any>): Parser<Array<A>> => originalInput =>
+ match(parser(originalInput), {
+ Ok: ({ value, input }) => map(
+ many0(prefixed(sepP, parser)),
+ ls => [value, ...ls]
+ )(input),
+ Err: _ => Result.Ok({ value: [], input: originalInput }),
+ })
+