diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2025-11-02 20:24:33 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2025-11-02 20:24:33 -0800 |
| commit | 632c153b974ee9c553d08beb27d5e4d60396a2ac (patch) | |
| tree | 69ace6b3f9b3dff5a8a90cf85829a2f13fcf2606 | |
| parent | 4dc08222b1b9160a699a03fca7cc0e21cc4bdece (diff) | |
map index
| -rw-r--r-- | src/lang/builtin/sbuiltin.ts | 4 | ||||
| -rw-r--r-- | src/lang/core/eval.ts | 13 | ||||
| -rw-r--r-- | src/lang/util/number.ts | 3 |
3 files changed, 13 insertions, 7 deletions
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<Fn, [Arr[Idx]], Frame> } + ? { [Idx in keyof Arr]: CallFn<Fn, [Arr[Idx], ExtractNumber<Idx>], Frame> } : EvalError<`Invalid params for map: ${ToString< GetEvaluatedChildren<Node, Frame> >}`>; 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 extends ASTNode> = Node["children"] extends [ - infer Arg extends ASTNode, + ...infer Args extends ASTNode[], infer Fn extends ASTNode ] - ? FnPrim<[Arg], Fn> + ? FnPrim<Args, Fn> : never; -type MapZip<T extends readonly ASTNode[], U extends readonly PropertyKey[]> = { +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<typeof input>; const parse_result = null as unknown as Parse<typeof lex_result>; const eval_result = null as unknown as Evaluate<typeof parse_result>; 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<M extends number, N extends number> = MultiplyInner< M, NumberToArray<N> >; + +export type ExtractNumber<T extends any> = + T extends `${infer Inner extends number}` ? Inner : never; |
