import { LexerCtx, Token, TokenSubType, TokenType } from "./common"; export type BreakingToken = | TokenType.OPEN_PAREN | TokenType.CLOSE_PAREN | TokenType.COMMA | TokenType.SEMICOLON | TokenType.SPACE; export type IsWhitespace = T extends `${TokenType.SPACE}` ? true : T extends `${TokenType.COMMA}` ? true : T extends `${TokenType.SEMICOLON}` ? true : false; export type ProcessNameCollection< Ctx extends LexerCtx, Tail extends string, _Token extends Token | null > = { next: Tail; nameCollection: ""; tokens: _Token extends null ? [ ...Ctx["tokens"], ...(Ctx["nameCollection"] extends "" ? [] : [ Token< TokenType.NAME, TokenSubType.REFERENCE, Ctx["nameCollection"] > ]) ] : [ ...Ctx["tokens"], ...(Ctx["nameCollection"] extends "" ? [_Token] : [ Token< TokenType.NAME, TokenSubType.REFERENCE, Ctx["nameCollection"] >, _Token ]) ]; }; export type IsOpen = T extends `${TokenType.OPEN_PAREN}` ? true : false; export type IsClose = T extends `${TokenType.CLOSE_PAREN}` ? true : false; export type _Lex = Ctx["next"] extends `${infer Head}${infer Tail}` ? IsWhitespace extends true ? _Lex> : IsOpen extends true ? _Lex>> : IsClose extends true ? _Lex>> : _Lex<{ next: Tail; nameCollection: `${Ctx["nameCollection"]}${Head}`; tokens: Ctx["tokens"]; }> : Ctx["tokens"]; export type Lex = _Lex<{ next: `${Raw};`; tokens: []; nameCollection: ""; }>;