From aa006086f69c827d780e6e0e69947ca7ee6e2c70 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sat, 8 Jan 2022 22:27:01 +0530 Subject: feat: adds exposed filter function --- TODO.md | 2 +- src/eval/index.ts | 4 ++-- src/index.ts | 17 ++++++++++++++++- tests/basic.spec.ts | 12 ++++++++++++ 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/basic.spec.ts diff --git a/TODO.md b/TODO.md index b471dc5..e1523ba 100644 --- a/TODO.md +++ b/TODO.md @@ -6,7 +6,7 @@ - [ ] Parse: `{2, 5}` quantifiers - [ ] Eval: `^$` start-end - [ ] Parse, Eval: Not/Inverse - - [ ] Func: filter + - [X] Func: filter - [ ] Func: match - [ ] Func: replace diff --git a/src/eval/index.ts b/src/eval/index.ts index d5c56c2..6656743 100644 --- a/src/eval/index.ts +++ b/src/eval/index.ts @@ -1,5 +1,5 @@ import { pipe } from 'fp-ts/function' -import {takeLeftWhile} from 'fp-ts/lib/Array' +import { takeLeftWhile } from 'fp-ts/lib/Array' import { Expr, ListExpr } from '../types' import { match } from '../utils' @@ -26,7 +26,7 @@ export const find = ([startO, exprs, endO]: ListExpr, list: T[]): any => { takeLeftWhile(x => check(expr)(x, i, list)), ) console.log(x) - + return true }, _: _ => false, diff --git a/src/index.ts b/src/index.ts index 82eefe8..691d676 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,17 @@ +import { fold, map } from 'fp-ts/lib/Either' +import { identity, pipe } from 'fp-ts/lib/function' +import { find } from './eval' +import { parser } from './parser' -export * from './parser'; +const toSourceString = (r: string | RegExp): string => typeof r === 'string' ? r : r.source + +export const filter = (listExp: string | RegExp, list: T[]): T[] => + pipe( + listExp, + toSourceString, + parser, + map(([lxp, _]) => find(lxp, list)), + fold(([err, _]) => { + throw new Error(err) + }, identity), + ) diff --git a/tests/basic.spec.ts b/tests/basic.spec.ts new file mode 100644 index 0000000..d964053 --- /dev/null +++ b/tests/basic.spec.ts @@ -0,0 +1,12 @@ +import { filter } from '../src' + +describe('Basic tests', () => { + it('should do it', () => { + expect(filter(/\s/, [1, '2', 3, '4'])).toEqual(['2', '4']) + expect(filter(/\n/, [1, '2', 3, '4'])).toEqual([1, 3]) + expect(filter(/\T/, [1, 0, '4', ''])).toEqual([1, '4']) + expect(filter(/\F/, [1, 0, '4', ''])).toEqual([0, '']) + expect(filter(/\F\T/, [1, 0, '4', ''])).toEqual([]) + expect(filter(/\s\T/, [1, 0, '4', ''])).toEqual(['4']) + }) +}) -- cgit v1.3.1