aboutsummaryrefslogtreecommitdiff
path: root/src/eval/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/index.ts')
-rw-r--r--src/eval/index.ts24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/eval/index.ts b/src/eval/index.ts
new file mode 100644
index 0000000..e88b583
--- /dev/null
+++ b/src/eval/index.ts
@@ -0,0 +1,24 @@
+import {pipe} from 'fp-ts/function';
+import { Expr, ListExpr } from '../types'
+import {match} from '../utils';
+
+export const find = <T>([startO, exprs, endO]: ListExpr, list: T[]): any => {
+ const check = (e: Expr) => <T>(x: T, _i: number, _l: T[]): boolean => {
+ return pipe(
+ e.tag as any,
+ match({
+ AnyItem: () => true,
+ AnyNumber: () => typeof x === 'number',
+ AnyString: () => typeof x === 'string',
+ AnyBool: () => typeof x === 'boolean',
+ Truthy: () => !!x,
+ Falsey: () => !x,
+ _: () => false,
+ })
+ )
+ };
+
+ const cs = exprs.map(check)
+
+ return list.filter((x, i, ls) => cs.every(c => c(x, i, ls)))
+}