diff options
Diffstat (limited to 'src/lang/ks-lang/index.ts')
| -rw-r--r-- | src/lang/ks-lang/index.ts | 24 |
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( |
