summaryrefslogtreecommitdiff
path: root/src/lang/ks-lang/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lang/ks-lang/index.ts')
-rw-r--r--src/lang/ks-lang/index.ts24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/lang/ks-lang/index.ts b/src/lang/ks-lang/index.ts
index e5a78b9..772c9c9 100644
--- a/src/lang/ks-lang/index.ts
+++ b/src/lang/ks-lang/index.ts
@@ -23,13 +23,23 @@ export const createFn =
<ArgsConstraint extends any[]>() =>
<Program extends string>(
program: Program
- ): Evaluate<Parse<Lex<Program>>> extends [infer ProgramFn extends FnPrim]
- ? TransformArgs<ProgramFn["args"]> extends ArgsConstraint
- ? <const Args extends ArgsConstraint>(
- ...args: Args
- ) => CallFn<ProgramFn, Args, EmptyStackFrame>
- : EvalError<`Program's args do not extend args constraint`>
- : EvalError<"Cannot create a function from a program that does not eval to a function"> => {
+ ): Evaluate<Parse<Lex<Program>>> extends infer E
+ ? E extends [infer ProgramFn extends FnPrim]
+ ? TransformArgs<ProgramFn["args"]> extends ArgsConstraint
+ ? <const Args extends ArgsConstraint>(
+ ...args: Args
+ ) => CallFn<ProgramFn, Args, EmptyStackFrame, []>
+ : EvalError<`Program's args do not extend args constraint`>
+ : E extends readonly [
+ readonly [infer Prim extends FnPrim, infer StackFrame, infer Name]
+ ]
+ ? TransformArgs<Prim["args"]> extends ArgsConstraint
+ ? <const Args extends ArgsConstraint>(
+ ...args: Args
+ ) => CallFn<E[0], Args, EmptyStackFrame, []>
+ : EvalError<`Program's args do not extend args constraint`>
+ : EvalError<"Cannot create a function from a program that does not eval to a function">
+ : never => {
const [programFn] = evaluate(parse(lex(program))) as Array<FnPrim>;
if (!programFn.fn) {
throw new Error(