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/common.ts | 7 ++++++- src/lib/core/eval.ts | 43 +++++++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 19 deletions(-) (limited to 'src/lib') diff --git a/src/lib/core/common.ts b/src/lib/core/common.ts index b5f494e..8cff899 100644 --- a/src/lib/core/common.ts +++ b/src/lib/core/common.ts @@ -38,7 +38,12 @@ export type ASTNode< Type extends NodeType = NodeType, Name extends string = string, Value extends any = any, - Children extends ASTNode[] = ASTNode[] + Children extends readonly ASTNode[] = readonly ASTNode< + NodeType, + string, + any, + any + >[] > = { type: Type; name: Name; 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