aboutsummaryrefslogtreecommitdiff
path: root/src/eval.ts
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/eval.ts118
1 files changed, 63 insertions, 55 deletions
diff --git a/src/eval.ts b/src/eval.ts
index 03391c2..466cafd 100644
--- a/src/eval.ts
+++ b/src/eval.ts
@@ -1,5 +1,5 @@
-import { Expr } from "./parser";
-import { match, matchString } from "./utils/adt";
+import { CSSUnit, Expr } from './parser'
+import { match, matchString } from './utils/adt'
export type EvalActions = {
addClass(id: string, classes: string): Promise<void>
@@ -14,59 +14,67 @@ export type EvalActions = {
type EvalValue = string | undefined | void
-export const evalExpr = async (expr: Expr, actions: EvalActions): Promise<EvalValue> =>
+export const evalExpr = async (
+ expr: Expr,
+ actions: EvalActions
+): Promise<EvalValue> =>
match<Promise<EvalValue>, Expr>(expr, {
- Call: async ({ name, args }) => {
- return matchString<Promise<EvalValue>, string>(name, {
- 'add-class': async () => {
- const id = await evalExpr(args[0], actions)
- const classes = await evalExpr(args[1], actions)
- if (id && classes) {
- await actions.addClass(id, classes)
- }
- },
- 'remove-class': async () => {
- const id = await evalExpr(args[0], actions)
- const classes = await evalExpr(args[1], actions)
- if (id && classes) {
- await actions.removeClass(id, classes)
- }
- },
- 'delay': async () => {
- const num = await evalExpr(args[0], actions)
- num && await actions.delay(parseInt(num, 10))
- },
- 'js-eval': async () => {
- const js = await evalExpr(args[0], actions)
- js && await actions.jsEval(js)
- },
- 'load-cssx': async () => {
- const id = await evalExpr(args[0], actions)
- const url = await evalExpr(args[1], actions)
- if (id && url) {
- await actions.loadCssx(id, url)
- }
- },
- 'var': async () => {
- const varName = await evalExpr(args[0], actions)
- const defaultValue = await evalExpr(args[1], actions)
- return varName && (actions.getVariable(varName) ?? defaultValue)
- },
- 'update': async () => {
- const id = await evalExpr(args[0], actions)
- const varName = await evalExpr(args[1], actions)
- const value = await evalExpr(args[2], actions)
- if (id && varName && value) {
- actions.updateVariable(id, varName, value)
- }
- },
- _: () => Promise.reject(new Error('not supposed to be here')),
- })
- },
- LiteralString: async s => s,
- Identifier: async s => s,
- VarIdentifier: async s => s,
- _: async _ => undefined,
+ Call: async ({ name, args }) => getFunctions(name, args, actions),
+ LiteralString: async (s) => s,
+ LiteralNumber: async ({ value, unit }) =>
+ matchString<number, CSSUnit>(unit, {
+ s: () => value * 1000,
+ _: () => value,
+ }).toString(),
+ Identifier: async (s) => s,
+ VarIdentifier: async (s) => s,
+ _: async (_) => undefined,
})
-
+const getFunctions = (name: string, args: Expr[], actions: EvalActions) =>
+ matchString<Promise<EvalValue>>(name, {
+ 'add-class': async () => {
+ const id = await evalExpr(args[0], actions)
+ const classes = await evalExpr(args[1], actions)
+ if (id && classes) {
+ await actions.addClass(id, classes)
+ }
+ },
+ 'remove-class': async () => {
+ const id = await evalExpr(args[0], actions)
+ const classes = await evalExpr(args[1], actions)
+ if (id && classes) {
+ await actions.removeClass(id, classes)
+ }
+ },
+ delay: async () => {
+ const num = await evalExpr(args[0], actions)
+ console.log(num)
+ num && (await actions.delay(parseInt(num, 10)))
+ },
+ 'js-eval': async () => {
+ const js = await evalExpr(args[0], actions)
+ js && (await actions.jsEval(js))
+ },
+ 'load-cssx': async () => {
+ const id = await evalExpr(args[0], actions)
+ const url = await evalExpr(args[1], actions)
+ if (id && url) {
+ await actions.loadCssx(id, url)
+ }
+ },
+ var: async () => {
+ const varName = await evalExpr(args[0], actions)
+ const defaultValue = await evalExpr(args[1], actions)
+ return varName && (actions.getVariable(varName) ?? defaultValue)
+ },
+ update: async () => {
+ const id = await evalExpr(args[0], actions)
+ const varName = await evalExpr(args[1], actions)
+ const value = await evalExpr(args[2], actions)
+ if (id && varName && value) {
+ actions.updateVariable(id, varName, value)
+ }
+ },
+ _: () => Promise.reject(new Error('not supposed to be here')),
+ })