From 628d0ef80b54859a9b2a3fa451d35c10028dc400 Mon Sep 17 00:00:00 2001 From: rowan Date: Wed, 16 Apr 2025 22:27:45 -0500 Subject: [PATCH] dedup many --- src/combinator.js | 21 +++++++++++++++++++++ src/cond.js | 15 +-------------- tests/units/index.js | 3 +-- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/combinator.js b/src/combinator.js index 25b665d..fa27d8c 100644 --- a/src/combinator.js +++ b/src/combinator.js @@ -32,3 +32,24 @@ export const anyOf = curry( any(...mapStr(char, str))(state) )) +export const map = curry( + /** + * @param {(...args: any[]) => any} fn + * @param {Parser} parser + * @param {ParserState} state + */ + (fn, parser, state) => { + return parser(state).chain(result => { + try { + /** @type {Result} */ + const parsed = fn(diff(state[0], result[0])) + const backtrack = Tuple(state[0], result[1]) + + + return succeed(parsed, backtrack) + } catch (e) { + return fail('failed to map', state, e) + } + }) + }) + diff --git a/src/cond.js b/src/cond.js index 8f3c629..eaf063a 100644 --- a/src/cond.js +++ b/src/cond.js @@ -44,19 +44,6 @@ export const until = parser => state => { return result } -export const many = curry((parser, state) => { - let result = ok(state) - - while (true) { - const [original, clone] = fork(result) - const res = result.chain(x => parser(clone)) - if (res.isOk()) { - result = res - } else { - break - } - } - - return result +export const skip = curry((parser, state) => { }) diff --git a/tests/units/index.js b/tests/units/index.js index bf8ff42..fbff9d6 100644 --- a/tests/units/index.js +++ b/tests/units/index.js @@ -4,8 +4,7 @@ import { mapStr, join } from '../../src/fn.js' export const Tests = [ it('whatever', () => { - const a = 'abcdef!!!!'.split('') - parse(str('abc'), 'abc').map(console.log) + }) ]