aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2022-01-14 19:43:45 +0530
committerAkshay Nair <phenax5@gmail.com>2022-01-14 20:31:58 +0530
commitc2c6e8d1258158f61fba026ded1e48ffc5b36cf6 (patch)
tree1762185b79411d0c64880cc43e5639a8a1e3d35d /src
parent564bd628e98dc44767891249e45677948e6ec17a (diff)
downloadelxr-c2c6e8d1258158f61fba026ded1e48ffc5b36cf6.tar.gz
elxr-c2c6e8d1258158f61fba026ded1e48ffc5b36cf6.zip
feat(eval): implements 0 or more quantifier
Diffstat (limited to 'src')
-rw-r--r--src/eval/index.ts15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/eval/index.ts b/src/eval/index.ts
index f56ff92..8e162b4 100644
--- a/src/eval/index.ts
+++ b/src/eval/index.ts
@@ -20,6 +20,8 @@ const group = <T>(value: T, index: number): MatchGroupIndexed<T> => ({
type index = number
+const indexed = <T>(ls: T[]): Array<[number, T]> => ls.map((x, i) => [i, x])
+
const accumulateSkip = () => {
const skipIndexes = [] as index[]
return {
@@ -100,13 +102,22 @@ const checkExpr = <T>(
),
OneOrMore: ({ expr }) => {
+ const { localSkip, getSkips } = accumulateSkip()
+ const result = checkExpr(Expr.ZeroOrMore({ expr }), item, list, index, localSkip)
+ return pipe(
+ result[0].value.length > 0 ? result : [],
+ skip(getSkips().reduce((a, b) => a + b, 0)),
+ )
+ },
+
+ ZeroOrMore: ({ expr }) => {
// TODO: Nested quantified expressions?
const matches = pipe(
list,
takeLeftWhile(a => checkExpr(expr, a, list, index).length > 0),
)
return pipe(
- matches.length > 0 ? [group(matches, index)] : [],
+ [group(matches, index)],
skip(matches.length || 1),
)
},
@@ -115,8 +126,6 @@ const checkExpr = <T>(
const { getSkips, localSkip } = accumulateSkip()
const getGroups = () => {
if (exprs.length > list.length) return []
- const indexed = <T>(ls: T[]): Array<[number, T]> =>
- ls.map((x, i) => [i, x])
const result = pipe(
zipWith(exprs, indexed(list), (expr, [i, val]) =>
checkExpr(expr, val, list.slice(i), index + i, localSkip),