import type { Ast, AstFromString } from './ast.js'; import type { Operation, OperationPacked } from './Operation.js'; type EvalAstArray_Accumulator = array extends [infer a, ...infer as] ? EvalAstArray_Accumulator<[...r, EvalAst], as, args> : array extends [] ? r : never; type EvalAstArray = EvalAstArray_Accumulator<[], array, args>; /** - TODO: tail recursion */ export type EvalAst = ast extends [ infer operation, infer asts ] ? operation extends keyof Operation ? asts extends unknown[] ? OperationPacked>[operation] : never : never : [ ...args, never, never, never, never, never, never, never, never, never, never ] extends [ infer A, infer B, infer C, infer D, infer E, infer F, infer G, infer H, infer I, ...unknown[] ] ? ast extends '1' ? A : ast extends '2' ? B : ast extends '3' ? C : ast extends '4' ? D : ast extends '5' ? E : ast extends '6' ? F : ast extends '7' ? G : ast extends '8' ? H : ast extends '9' ? I : never : never; /** - TODO: constrain it better, not just `string` */ type ExprString = string; export type Expr = Ast | keyof Operation | ExprString; export type PreprocessExpr = E extends keyof Operation ? E : E extends string ? AstFromString : E; export type Eval = expr extends keyof Operation ? OperationPacked[expr] : expr extends Ast ? EvalAst : expr extends string ? EvalAst, args> : never; export {}; //# sourceMappingURL=eval.d.ts.map