aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2024-01-21 19:34:49 +0530
committerAkshay Nair <phenax5@gmail.com>2024-01-21 19:34:49 +0530
commite4db8ebdd6a36df0b3d76504d18d8f183fe46ba9 (patch)
tree807071e55e97d8169158c896822cc57c023c9af1 /src
parentc9075367a178644d12a179919aa07616938b7315 (diff)
downloadcss-everything-e4db8ebdd6a36df0b3d76504d18d8f183fe46ba9.tar.gz
css-everything-e4db8ebdd6a36df0b3d76504d18d8f183fe46ba9.zip
feat: adds example for calculator
Diffstat (limited to '')
-rw-r--r--src/eval.ts52
-rw-r--r--src/parser.ts2
2 files changed, 52 insertions, 2 deletions
diff --git a/src/eval.ts b/src/eval.ts
index 87bcd6d..84ab52f 100644
--- a/src/eval.ts
+++ b/src/eval.ts
@@ -371,10 +371,59 @@ const getFunctions = (
return EvalValue.Number(result)
},
+ // TODO: Structural comparison?
+ equals: async () =>
+ compare(
+ args[0],
+ args[1],
+ actions,
+ (a, b) => evalValueToString(a) === evalValueToString(b),
+ ),
+
+ gt: async () =>
+ compare(
+ args[0],
+ args[1],
+ actions,
+ (a, b) => (evalValueToNumber(a) ?? 0) > (evalValueToNumber(b) ?? 0),
+ ),
+
+ lt: async () =>
+ compare(
+ args[0],
+ args[1],
+ actions,
+ (a, b) => (evalValueToNumber(a) ?? 0) < (evalValueToNumber(b) ?? 0),
+ ),
+
+ gte: async () =>
+ compare(
+ args[0],
+ args[1],
+ actions,
+ (a, b) => (evalValueToNumber(a) ?? 0) >= (evalValueToNumber(b) ?? 0),
+ ),
+
+ lte: async () =>
+ compare(
+ args[0],
+ args[1],
+ actions,
+ (a, b) => (evalValueToNumber(a) ?? 0) <= (evalValueToNumber(b) ?? 0),
+ ),
+
_: () => Promise.reject(new Error(`Not implemented: ${name}`)),
})
}
+export const compare = async (
+ a: Expr,
+ b: Expr,
+ actions: EvalActions,
+ cmp: (a: EvalValue, b: EvalValue) => boolean,
+) =>
+ EvalValue.Boolean(cmp(await evalExpr(a, actions), await evalExpr(b, actions)))
+
const evalBinOp = async (
left: Expr,
right: Expr,
@@ -401,7 +450,8 @@ export const evalCalcExpr = (
}),
Parens: ({ expr }) => evalCalcExpr(expr, actions),
_: async () => {
- if (expr.tag === 'Call' && expr.value.name === 'var') {
+ // Special expressions to double-evaluate
+ if (expr.tag === 'Call' && ['var', 'get-var'].includes(expr.value.name)) {
const value = await evalExprAsString(expr, actions)
try {
const pvalue = await evalExpr(parseExpr(value ?? ''), actions)
diff --git a/src/parser.ts b/src/parser.ts
index 81f7a9e..928fc00 100644
--- a/src/parser.ts
+++ b/src/parser.ts
@@ -116,7 +116,7 @@ const precedence = (op: BinOp) =>
_: () => -1,
})
-const binOpWithFixitySwitchity = (op: BinOp, left: Expr, right: Expr) =>
+const binOpWithFixitySwitchity = (op: BinOp, left: Expr, right: Expr): Expr =>
match(right, {
BinOp: binOp => {
if (precedence(op) >= precedence(binOp.op)) {