From fcb7bd4a61bd8614652a94b842b6d261ff8403a7 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Mon, 24 Jan 2022 19:38:34 +0530 Subject: feat(eval): adds min-max quantifier evaluation --- src/eval/index.ts | 17 +++++++++++++++++ tests/basic.spec.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/eval/index.ts b/src/eval/index.ts index ed757e7..96ccbef 100644 --- a/src/eval/index.ts +++ b/src/eval/index.ts @@ -108,6 +108,23 @@ const checkExpr = ( ) }, + MinMax: ({ expr, min, max }) => { + const { localSkip, getSkips } = accumulateSkip() + const result = checkExpr(Expr.ZeroOrMore({ expr }), item, list, index, localSkip) + // TODO: Use nested skips + + const matches = result[0].value.length + const capturedMatchCount = matches < min ? 0 : Math.min(matches, max) + // const skipCount = getSkips().reduce((a, b) => a + b, 0) + + return pipe( + result + .map(r => ({ ...r, value: r.value.slice(0, capturedMatchCount) })) + .filter(r => r.value.length > 0), + skip(capturedMatchCount || 1), + ) + }, + ZeroOrMore: ({ expr }) => { // TODO: Nested quantified expressions? const matches = pipe( diff --git a/tests/basic.spec.ts b/tests/basic.spec.ts index 33a4228..db074d4 100644 --- a/tests/basic.spec.ts +++ b/tests/basic.spec.ts @@ -198,5 +198,46 @@ describe('Basic tests', () => { }, ]) }) + + it('should match min-max quantified expressions', () => { + expect( + matchAll(/[age \n]{2, 4}/, [ + {}, + { age: 1 }, + '', + ]).groups, + ).toEqual([]) + + expect( + matchAll(/[age \n]{2, 4}/, [ + {}, + { age: 1 }, + { age: 0 }, + '', + ]).groups, + ).toEqual([{ value: [{ age: 1 }, { age: 0 }], index: 1 }]) + + expect( + matchAll(/[age \n]{2, 4}/, [ + {}, + { age: 1 }, + { age: 2 }, + { age: 0 }, + '', + ]).groups, + ).toEqual([{ value: [{ age: 1 }, { age: 2 }, { age: 0 }], index: 1 }]) + + expect( + matchAll(/[age \n]{2, 4}/, [ + {}, + { age: 1 }, + { age: 2 }, + { age: 0 }, + { age: 8 }, + { age: 4 }, + '', + ]).groups, + ).toEqual([{ value: [{ age: 1 }, { age: 2 }, { age: 0 }, { age: 8 }], index: 1 }]) + }) }) }) -- cgit v1.3.1