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 >}`>; type Reduce< Arr extends readonly any[], Fn extends FnPrim, Acc, IdxLen extends readonly any[] = readonly [] > = Arr extends [infer Head, ...infer Tail] ? Reduce< Tail, Fn, CallFn, [...IdxLen, any] > : Acc; export type SBUILTIN_Reduce< Node extends ASTNode, Frame extends StackFrame, Callstack extends readonly string[] > = GetEvaluatedChildren extends [ infer Arr extends readonly any[], infer Fn extends FnPrim, infer Acc ] ? Reduce : EvalError<`Invalid params for reduce: ${ToString< GetEvaluatedChildren >}`>; type Filter< Arr extends readonly any[], Fn extends FnPrim, Collected extends readonly any[] = [], IdxLen extends readonly any[] = readonly [] > = Arr extends [infer Head, ...infer Tail] ? Filter< Tail, Fn, CallFn extends true ? [...Collected, Head] : Collected, [...IdxLen, any] > : Collected; export type SBUILTIN_Filter< Node extends ASTNode, Frame extends StackFrame, Callstack extends readonly string[] > = GetEvaluatedChildren extends [ infer Arr extends readonly any[], infer Fn extends FnPrim ] ? Filter : EvalError<`Invalid params for filter: ${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;