From b8fd8f0672c289ff43e501f430b76de1c7b0440a Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Tue, 4 Nov 2025 20:53:14 -0800 Subject: constrained args for createFn --- src/lang/ks-lang/index.ts | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/lang/ks-lang/index.ts b/src/lang/ks-lang/index.ts index c9c7405..e5a78b9 100644 --- a/src/lang/ks-lang/index.ts +++ b/src/lang/ks-lang/index.ts @@ -14,19 +14,29 @@ export type TransformArgs = { [Idx in keyof Args]: any; }; -export const createFn = ( - program: Program -): Evaluate>> extends [infer ProgramFn extends FnPrim] - ? >( - ...args: Args - ) => CallFn - : EvalError<"Cannot create a function from a program that does not eval to a function"> => { - const [programFn] = evaluate(parse(lex(program))) as Array; - if (!programFn.fn) { - throw new Error( - "Cannot create a function from a program that does not eval to a function" - ); - } +export type AssertArgs< + Args extends readonly ASTNode[], + ArgsConstraint extends readonly any[] +> = TransformArgs extends ArgsConstraint ? ArgsConstraint : never; - return ((...args: any[]) => callFn(programFn, args, emptyStackFrame)) as any; -}; +export const createFn = + () => + ( + program: Program + ): Evaluate>> extends [infer ProgramFn extends FnPrim] + ? TransformArgs extends ArgsConstraint + ? ( + ...args: Args + ) => CallFn + : EvalError<`Program's args do not extend args constraint`> + : EvalError<"Cannot create a function from a program that does not eval to a function"> => { + const [programFn] = evaluate(parse(lex(program))) as Array; + if (!programFn.fn) { + throw new Error( + "Cannot create a function from a program that does not eval to a function" + ); + } + + return ((...args: any[]) => + callFn(programFn, args, emptyStackFrame)) as any; + }; -- cgit v1.2.3-70-g09d2