aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/eval/index.ts24
-rw-r--r--src/parser/index.ts4
-rw-r--r--src/types.ts7
-rw-r--r--src/utils.ts3
-rw-r--r--tests/eval.spec.ts20
-rw-r--r--tests/parser.spec.ts (renamed from tests/basic.spec.ts)0
6 files changed, 56 insertions, 2 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)))
+}
diff --git a/src/parser/index.ts b/src/parser/index.ts
index b8e6764..4ad3e7b 100644
--- a/src/parser/index.ts
+++ b/src/parser/index.ts
@@ -12,7 +12,7 @@ import {
symbol,
tuple3,
} from './utils'
-import { Expr } from '../types'
+import { Expr, ListExpr } from '../types'
export const start = mapTo(symbol('^'), _ => Expr.Start(null))
export const end = mapTo(symbol('$'), _ => Expr.End(null))
@@ -67,7 +67,7 @@ export const expressionP: Parser<Expr> = (input: string) =>
wrapAlt,
)
-export const parser = tuple3(optional(start), many1(expressionP), optional(end))
+export const parser: Parser<ListExpr> = tuple3(optional(start), many1(expressionP), optional(end))
/*
diff --git a/src/types.ts b/src/types.ts
index 7f6546f..979745f 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,3 +1,4 @@
+import {Option} from "fp-ts/lib/Option"
import { constructors, Union } from "./utils"
type ExprT = {
@@ -21,3 +22,9 @@ export type Expr = Union<ExprT>
export const Expr = constructors<ExprT>()
+export type ListExpr = [
+ Option<Expr>,
+ Expr[],
+ Option<Expr>,
+]
+
diff --git a/src/utils.ts b/src/utils.ts
index 7e3009f..8e3abb9 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -22,3 +22,6 @@ export const constructors = <T extends Record<string, any>>(): {
},
},
) as any
+
+export const jlog = (x: any) => console.log(JSON.stringify(x, null, 2))
+
diff --git a/tests/eval.spec.ts b/tests/eval.spec.ts
new file mode 100644
index 0000000..97995bf
--- /dev/null
+++ b/tests/eval.spec.ts
@@ -0,0 +1,20 @@
+import { left, right } from 'fp-ts/Either'
+import { none, some } from 'fp-ts/Option'
+import { Expr, ListExpr } from '../src/types'
+import { jlog } from '../src/utils'
+import { find } from '../src/eval'
+
+describe('Eval', () => {
+ it('should do shit', () => {
+ const liexp: ListExpr = [
+ none,
+ [ Expr.AnyNumber(null), Expr.Truthy(null) ],
+ none,
+ ]
+
+ const list = [0, 1, '2', 3, [4], 5]
+
+ expect(find(liexp, list)).toEqual([1, 3, 5])
+ })
+})
+
diff --git a/tests/basic.spec.ts b/tests/parser.spec.ts
index 150966b..150966b 100644
--- a/tests/basic.spec.ts
+++ b/tests/parser.spec.ts