From 6aec6197fbd916c2930813b46b07e726803993f0 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Fri, 11 Aug 2023 19:25:17 +0530 Subject: refactor: minor refactor --- src/eval.ts | 118 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 63 insertions(+), 55 deletions(-) (limited to 'src/eval.ts') 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 @@ -14,59 +14,67 @@ export type EvalActions = { type EvalValue = string | undefined | void -export const evalExpr = async (expr: Expr, actions: EvalActions): Promise => +export const evalExpr = async ( + expr: Expr, + actions: EvalActions +): Promise => match, Expr>(expr, { - Call: async ({ name, args }) => { - return matchString, 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(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>(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')), + }) -- cgit v1.3.1