From 2326b6ce7d9135dc350d2005f75bf89584750d39 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Wed, 29 Oct 2025 21:43:54 -0700 Subject: rendering works --- src/lib/core/eval.ts | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) (limited to 'src/lib/core/eval.ts') diff --git a/src/lib/core/eval.ts b/src/lib/core/eval.ts index 7c2c91b..10cc23c 100644 --- a/src/lib/core/eval.ts +++ b/src/lib/core/eval.ts @@ -9,7 +9,7 @@ export type ToStringInner = T extends | number ? `${T}` : T extends readonly any[] - ? T extends [infer Head, ...infer Tail] + ? T extends readonly [infer Head, ...infer Tail] ? `${ToStringInner< Tail, `${Carry extends "" ? "" : `${Carry}, `}${ToStringInner}` @@ -17,11 +17,22 @@ export type ToStringInner = T extends : `[${Carry}]` : FnError<`Can't stringify`>; -export type BUILTIN_ToString = { - [Idx in Exclude]: Args[Idx] extends ASTNode - ? ToStringInner> - : never; -}; +export type UnarrayIfOnlyHead = T extends [ + infer Head, + infer Next +] + ? T + : T extends [infer Head] + ? Head + : T; + +export type BUILTIN_ToString = ToStringInner< + UnarrayIfOnlyHead<{ + [Idx in keyof Args]: Args[Idx] extends ASTNode + ? ToStringInner> + : never; + }> +>; // export type BUILTIN_Print export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__"; @@ -34,22 +45,18 @@ export type EvalError = `Eval error: ${T}`; export type Evaluate = Node["type"] extends NodeType.INT ? Node["value"] : Node["type"] extends NodeType.ROOT - ? { - // FIXME render as array?? - [Idx in Exclude< - keyof Node["children"], - keyof any[] - >]: Node["children"][Idx] extends ASTNode - ? Evaluate - : never; - // indexing for now to remove object syntax - // pls fix - }[Exclude] + ? Node["children"] extends infer Children extends readonly ASTNode[] + ? UnarrayIfOnlyHead<{ + [Idx in keyof Children]: Children[Idx] extends ASTNode + ? Evaluate + : never; + }> + : EvalError<`Unexpected error parsing children of ${Node["type"]}`> : Node["type"] extends NodeType.EXT ? MapBuiltins : EvalError<`Unhandled node type ${Node["type"]}`>; -const input = `tostring(5, 3)` as const; +const input = `tostring(5, 2)` 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