summaryrefslogtreecommitdiff
path: root/src/lang
diff options
context:
space:
mode:
Diffstat (limited to 'src/lang')
-rw-r--r--src/lang/builtin/sbuiltin.ts4
-rw-r--r--src/lang/core/eval.ts13
-rw-r--r--src/lang/util/number.ts3
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;