From 3b0e7428441f85de5e76a59abbb09931bcf2387b Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Fri, 14 Jan 2022 21:15:19 +0530 Subject: feat: implements manyTill parser combinator --- src/parser/utils.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src/parser/utils.ts') diff --git a/src/parser/utils.ts b/src/parser/utils.ts index 4b68aff..4e2c9d6 100644 --- a/src/parser/utils.ts +++ b/src/parser/utils.ts @@ -3,7 +3,7 @@ import * as Either from 'fp-ts/Either' import * as Option from 'fp-ts/Option' import { fst, mapFst, mapSnd, snd } from 'fp-ts/Tuple' import { eq } from '../utils' -import { prepend } from 'fp-ts/Array' +import { flatten, prepend } from 'fp-ts/Array' export type char = string @@ -29,6 +29,19 @@ export const sepBy1 = (sep: Parser, parser: Parser): Parser => ), ) +export const not = (parser: Parser): Parser => (input: string) => + pipe( + input, + parser, + Either.fold( + ([_left, inp]) => Either.right([null, inp]), + ([_right, inp]) => Either.left(['`not` parser failed. Match found', inp]) + ), + ) + +export const manyTill = (parser: Parser, end: Parser): Parser => + mapTo(pair(many0(suffixed(parser, not(end))), parser), ([xs, l]) => xs.concat([l])) + export const many0 = (parser: Parser): Parser> => flow( parser, -- cgit v1.3.1