diff options
Diffstat (limited to 'src/eval')
| -rw-r--r-- | src/eval/index.ts | 24 |
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))) +} |
