import { FnError } from "."; import { ASTNode, StackFrame } from "../core/common"; import { CallFn, FnPrim, GetEvaluatedChildren, EvalError, _Evaluate, } from "../core/eval"; import { ExtractNumber, ToString } from "../util"; export type SBUILTIN_Call< Node extends ASTNode, Frame extends StackFrame, Callstack extends readonly string[] > = GetEvaluatedChildren extends [ infer Fn, ...infer Values extends readonly any[] ] ? CallFn : EvalError<`Invalid params for function call: ${ToString< GetEvaluatedChildren >}`>; export type SBUILTIN_Map< Node extends ASTNode, Frame extends StackFrame, Callstack extends readonly string[] > = GetEvaluatedChildren extends [ infer Arr extends readonly any[], infer Fn extends FnPrim ] ? { [Idx in keyof Arr]: CallFn< Fn, [Arr[Idx], ExtractNumber], Frame, Callstack >; } : EvalError<`Invalid params for map: ${ToString< GetEvaluatedChildren >}`>; export type SBUILTIN_IfElse< Node extends ASTNode, Frame extends StackFrame, Callstack extends readonly string[] > = Node["children"] extends infer Children extends readonly ASTNode[] ? Children extends [infer A, infer B, infer C, infer D] ? FnError<`Invalid args for "if": ${ToString}`> : Children extends [ infer Cond extends ASTNode, infer TrueVal extends ASTNode, infer FalseVal extends ASTNode ] ? _Evaluate extends true ? _Evaluate : _Evaluate extends false ? _Evaluate : FnError<`Condition value ${ToString} is not a boolean`> : FnError<`Invalid args for "if": ${ToString}`> : never;