import { Inc, Dec } from '../../utils/numbers'; import { Tail, StringToTuple } from '../../utils/tuples'; import { LowercaseChars, UppercaseChars } from './types'; export type TrimParens = T extends `(${infer U})` ? U : T; type TrimLeft = T extends ` ${infer U}` ? TrimLeft : T; type TrimRight = T extends `${infer U} ` ? TrimRight : T; export type Trim = TrimLeft>; type SplitTupleFnWithParens = T extends [infer Char extends string, ...infer Rest extends string[]] ? Char extends `(` ? SplitTupleFnWithParens> : Char extends `)` ? SplitTupleFnWithParens> : $nested extends 0 ? [Char, Rest[0]] extends ['-', '>'] ? SplitTupleFnWithParens, [...$accTuple, Trim<$acc>], '', 0> : SplitTupleFnWithParens : SplitTupleFnWithParens : [...$accTuple, Trim<$acc>]; export type SplitFnWithParens = Input extends string ? SplitTupleFnWithParens> : never; type SplitTupleParamWithParens = T extends [infer Char extends string, ...infer Rest extends string[]] ? Char extends `(` ? SplitTupleParamWithParens> : Char extends `)` ? SplitTupleParamWithParens> : $nested extends 0 ? Char extends ' ' ? $acc extends '' ? SplitTupleParamWithParens : SplitTupleParamWithParens], '', 0> : SplitTupleParamWithParens : SplitTupleParamWithParens : Trim<$acc> extends '' ? $accTuple : [...$accTuple, Trim<$acc>]; export type SplitParamWithParens = Input extends string ? SplitTupleParamWithParens> : never; export type MapArgsAST = { [K in keyof Input]: ParseAST>; }; export type ParseArgsAST = Input extends `${UppercaseChars}${string}` ? [ParseTypeConstructorAST] : MapArgsAST>; export type ParseTypeConstructorAST> = $args extends [ infer Constructor, ...infer Args, infer Last ] ? Last extends `..${infer Spread}` ? { type: 'typeconstructor'; name: Constructor; params: MapArgsAST; spread: Spread; } : { type: 'typeconstructor'; name: Constructor; params: MapArgsAST<[...Args, Last]>; } : never; export type ParseFromArrayToManyAST = Types extends [infer Type extends string, ...infer Rest] ? Rest['length'] extends 0 ? Type extends `${UppercaseChars}${string}` ? [ParseTypeConstructorAST] : Type extends `${LowercaseChars}${string}` ? [{ type: 'type'; name: Type; }] : ParseArgsAST : Rest['length'] extends 1 ? [ { type: 'function'; args: ParseArgsAST; result: ParseAST>; } ] : [ { type: 'chain'; args: ParseArgsAST; result: ParseFromArrayToManyAST[0]; } ] : never; export type ParseToManyAST>> = $result; export type ParseAST> = $result extends [infer Result, ...any[]] ? Result : never; export {};