summaryrefslogtreecommitdiff
path: root/src/lang/core/eval.ts
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2025-11-02 20:24:33 -0800
committerKai Stevenson <kai@kaistevenson.com>2025-11-02 20:24:33 -0800
commit632c153b974ee9c553d08beb27d5e4d60396a2ac (patch)
tree69ace6b3f9b3dff5a8a90cf85829a2f13fcf2606 /src/lang/core/eval.ts
parent4dc08222b1b9160a699a03fca7cc0e21cc4bdece (diff)
map index
Diffstat (limited to 'src/lang/core/eval.ts')
-rw-r--r--src/lang/core/eval.ts13
1 files changed, 8 insertions, 5 deletions
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>;