import type { Operation } from './Operation.js'; import type { Tokenize } from './tokenize.js'; export type Ast = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | [keyof Operation, Ast[]]; type Finalize = nodes extends [...unknown[], unknown, unknown] ? Rec_StepOut : nodes extends [['', [infer arg]]] ? arg : nodes extends [infer node] ? node : never; type Rec_Op1 = nodes extends [ ...infer ns, [ '', [] ] ] ? Rec<[...ns, [t, []]], ts> : Rec<[...nodes, [t, []]], ts>; type Rec_FixPrecedence = nodes extends [ ...infer ns, [ infer op1, [...infer args1] ], [ infer op2, [infer a2, ...infer args2] ] ] ? op1 extends string ? op2 extends string ? `&|^` extends `${string}${op2}${string}${op1}${string}` ? Rec : Rec_FixPrecedence<[ ...ns, [op2, [[op1, [...args1, a2]], ...args2]] ], ts> : Rec : Rec : Rec; type Rec_Op2 = nodes extends [ ...infer ns, [ infer op, infer args ] ] ? [op, args] extends ['', [infer a]] ? Rec<[...ns, [t, [a]]], ts> : [op, args] extends ['', [] | [unknown, unknown, ...unknown[]]] ? never : args extends [...infer as, infer b] ? op extends string ? Rec_FixPrecedence<[...ns, [op, as], [t, [b]]], ts> : never : never : never; type Rec_Lit = nodes extends [ ...infer ns, [ infer op, [...infer args] ] ] ? Rec<[...ns, [op, [...args, t]]], ts> : never; type Rec_StepIn = Rec<[ ...nodes, ['', []] ], tokens>; type Rec_StepOut = nodes extends [ ...infer nodesRest, [ infer op, [...infer args] ], infer b ] ? Rec<[...nodesRest, [op, [...args, b]]], tokens> : never; type Rec = tokens extends [ infer t, ...infer ts ] ? t extends '!!' ? Finalize : t extends '(' ? Rec_StepIn : t extends ')' ? Rec_StepOut : t extends string ? '&|^' extends `${string}${t}${string}` ? Rec_Op2 : '123456789' extends `${string}${t}${string}` ? Rec_Lit : Rec_Op1 : never : never; export type AstFromTokens = Rec<[ ['', []] ], [ ...tokens, '!!' ]>; export type AstFromString = AstFromTokens>; export {}; //# sourceMappingURL=ast.d.ts.map