From 77b22abdbb9d2b451fe31d97fec2f3a6b9517c33 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Thu, 13 Jan 2022 14:00:23 +0530 Subject: refactor: refactors in cps to skip items --- src/eval/index.ts | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/eval/index.ts b/src/eval/index.ts index 3ba688f..4a16b9b 100644 --- a/src/eval/index.ts +++ b/src/eval/index.ts @@ -1,4 +1,4 @@ -import { pipe } from 'fp-ts/function' +import { identity, pipe } from 'fp-ts/function' import { takeLeftWhile, zip } from 'fp-ts/lib/Array' import { chain, @@ -26,21 +26,28 @@ const group = (value: T, index: number): MatchGroupIndexed => ({ index, }) +type index = number + const checkExpr = ( expr: Expr, item: T, list: T[], index: number, + skip: (n: index) => (m: MatchGroupIndexed[]) => typeof m = _ => + identity, ): MatchGroupIndexed[] => { return pipe( expr, match[], Expr>({ - AnyItem: _ => [group(item, index)], - AnyNumber: _ => (typeof item === 'number' ? [group(item, index)] : []), - AnyString: _ => (typeof item === 'string' ? [group(item, index)] : []), - AnyBool: _ => (typeof item === 'boolean' ? [group(item, index)] : []), - Truthy: _ => (!!item ? [group(item, index)] : []), - Falsey: _ => (!item ? [group(item, index)] : []), + AnyItem: _ => pipe([group(item, index)], skip(1)), + AnyNumber: _ => + pipe(typeof item === 'number' ? [group(item, index)] : [], skip(1)), + AnyString: _ => + pipe(typeof item === 'string' ? [group(item, index)] : [], skip(1)), + AnyBool: _ => + pipe(typeof item === 'boolean' ? [group(item, index)] : [], skip(1)), + Truthy: _ => pipe(!!item ? [group(item, index)] : [], skip(1)), + Falsey: _ => pipe(!item ? [group(item, index)] : [], skip(1)), Group: ({ exprs }) => { const [head, ...tail] = exprs @@ -62,6 +69,7 @@ const checkExpr = ( return pipe( matches, getOrElseW(() => []), + skip(1), ) }, @@ -71,6 +79,7 @@ const checkExpr = ( ? checkExpr(Expr.Group({ exprs }), item[name], list, index) : [], res => (res.length > 0 ? [group(item, index)] : []), // FIXME: doesn't allow nested matching + skip(1), ), OneOrMore: ({ expr }) => { @@ -79,7 +88,7 @@ const checkExpr = ( list, takeLeftWhile(a => checkExpr(expr, a, list, index).length > 0), ) - return matches.length > 0 ? [group(matches, index)] : [] + return pipe(matches.length > 0 ? [group(matches, index)] : [], skip(1)) }, _: _ => [], @@ -87,7 +96,6 @@ const checkExpr = ( ) } -// :: ListExpr -> [a] -> [{ groups: [T] }] export const matchAll = ( [startO, exprs, endO]: ListExpr, list: T[], @@ -95,26 +103,14 @@ export const matchAll = ( const check = (index: number, ls: T[], expr: Expr): MatchGroupIndexed[] => { if (ls.length === 0) return [] - const [item, ...rest] = ls + const [item] = ls const next = (i: number = 1) => (curMatch: MatchGroupIndexed[]) => [...curMatch, ...check(index + i, ls.slice(i), expr)] - return pipe( - expr, - match[], Expr>({ - OneOrMore: ({ expr }) => { - return pipe( - checkExpr(expr, item, ls, index), - matches => next(1)(matches), // matches.length || - ) - }, - - _: _ => pipe(checkExpr(expr, item, ls, index), next()), - }), - ) + return checkExpr(expr, item, ls, index, next) } const expr = Expr.Group({ exprs }) -- cgit v1.3.1