From f53622d63c74a1e2dd0397f4a26f31aa72dea60b Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sun, 2 Nov 2025 18:02:35 -0800 Subject: add "mul" --- src/lib/core/eval.ts | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/core/eval.ts b/src/lib/core/eval.ts index 65e4788..59cda1d 100644 --- a/src/lib/core/eval.ts +++ b/src/lib/core/eval.ts @@ -55,6 +55,18 @@ export type AddStrings< ? AddStrings : Carry; +export type MultiplyInner< + N extends number, + MS extends readonly any[], + Carry extends number = 0 +> = MS extends [infer Head extends number, ...infer Tail extends readonly any[]] + ? MultiplyInner> + : Carry; +export type Multiply = MultiplyInner< + M, + NumberToArray +>; + export type BUILTIN_Arr = Args; export type BUILTIN_ToString = ToStringInner< @@ -70,6 +82,16 @@ export type BUILTIN_Add = ? AddNumbers : FnError<`Cannot add operands ${ToStringInner}`>; +export type BUILTIN_Mul = Args extends [ + infer A, + infer B, + infer C +] + ? FnError<`Can only multiply [number, number], but got ${ToStringInner}`> + : Args extends [infer M extends number, infer N extends number] + ? Multiply + : FnError<`Can only multiply [number, number], but got ${ToStringInner}`>; + export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__"; export type MapBuiltins = Node["children"] extends infer Children extends readonly ASTNode[] @@ -84,6 +106,8 @@ export type MapBuiltins = ? BUILTIN_Arr : Node["name"] extends "add" ? BUILTIN_Add + : Node["name"] extends "mul" + ? BUILTIN_Mul : SENTINEL_NO_BUILTIN : never : never; @@ -96,7 +120,7 @@ export type Evaluate = Node["type"] extends NodeType.INT ? MapBuiltins : EvalError<`Unhandled node type ${Node["type"]}`>; -const input = `add(1,2,3,4,5)` as const; +const input = `` as const; const lex_result = null as unknown as Lex; const parse_result = null as unknown as Parse; const eval_result = null as unknown as Evaluate; -- cgit v1.2.3-70-g09d2