From 632c153b974ee9c553d08beb27d5e4d60396a2ac Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sun, 2 Nov 2025 20:24:33 -0800 Subject: map index --- src/lang/builtin/sbuiltin.ts | 4 ++-- src/lang/core/eval.ts | 13 ++++++++----- src/lang/util/number.ts | 3 +++ 3 files changed, 13 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/lang/builtin/sbuiltin.ts b/src/lang/builtin/sbuiltin.ts index f291de3..01f197e 100644 --- a/src/lang/builtin/sbuiltin.ts +++ b/src/lang/builtin/sbuiltin.ts @@ -1,6 +1,6 @@ import { ASTNode, StackFrame } from "../core/common"; import { CallFn, FnPrim, GetEvaluatedChildren, EvalError } from "../core/eval"; -import { ToString } from "../util"; +import { ExtractNumber, ToString } from "../util"; export type SBUILTIN_Call< Node extends ASTNode, @@ -21,7 +21,7 @@ export type SBUILTIN_Map< infer Arr extends readonly any[], infer Fn extends FnPrim ] - ? { [Idx in keyof Arr]: CallFn } + ? { [Idx in keyof Arr]: CallFn], Frame> } : EvalError<`Invalid params for map: ${ToString< GetEvaluatedChildren >}`>; diff --git a/src/lang/core/eval.ts b/src/lang/core/eval.ts index 3dcf9b0..981aef8 100644 --- a/src/lang/core/eval.ts +++ b/src/lang/core/eval.ts @@ -52,15 +52,17 @@ export type FnPrim< Fn extends ASTNode = ASTNode > = { args: Args; fn: Fn }; -// Can support multiple args, just need to make the last arg be the fn export type HandleFn = Node["children"] extends [ - infer Arg extends ASTNode, + ...infer Args extends ASTNode[], infer Fn extends ASTNode ] - ? FnPrim<[Arg], Fn> + ? FnPrim : never; -type MapZip = { +export type MapZip< + T extends readonly ASTNode[], + U extends readonly PropertyKey[] +> = { [Idx in Exclude< keyof T, keyof any[] @@ -102,7 +104,8 @@ export type GetEvaluatedChildren< } : never; -const input = `map(arr(5,5,5), fn(n, add(n, 1)))` as const; +const input = + `map(arr("hello","world"),fn(s,i,add(tostring(i),":",s)))` 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; diff --git a/src/lang/util/number.ts b/src/lang/util/number.ts index 132994b..6e4e360 100644 --- a/src/lang/util/number.ts +++ b/src/lang/util/number.ts @@ -32,3 +32,6 @@ export type Multiply = MultiplyInner< M, NumberToArray >; + +export type ExtractNumber = + T extends `${infer Inner extends number}` ? Inner : never; -- cgit v1.2.3-70-g09d2