import * as Tokens from './token'; import * as Types from './types'; type ContextParser = (Parse extends [infer Context extends unknown, infer Rest extends string] ? Parse : []); type ArrayParser = (Parse extends [infer Value1 extends unknown, infer Rest extends string] ? ArrayParser : [Result, Code]); type ConstParser = (Tokens.Const extends [infer Match extends Value, infer Rest extends string] ? [Match, Rest] : []); type IdentParser = (Tokens.Ident extends [infer Match extends string, infer Rest extends string] ? [Match, Rest] : []); type NumberParser = (Tokens.Number extends [infer Match extends string, infer Rest extends string] ? [Match, Rest] : []); type OptionalParser = (Parse extends [infer Value extends unknown, infer Rest extends string] ? [[Value], Rest] : [[], Code]); type StringParser = (Tokens.String extends [infer Match extends string, infer Rest extends string] ? [Match, Rest] : []); type TupleParser = (Parsers extends [infer Left extends Types.IParser, ...infer Right extends Types.IParser[]] ? Parse extends [infer Value extends unknown, infer Rest extends string] ? TupleParser : [] : [Result, Code]); type UnionParser = (Parsers extends [infer Left extends Types.IParser, ...infer Right extends Types.IParser[]] ? Parse extends [infer Value extends unknown, infer Rest extends string] ? [Value, Rest] : UnionParser : []); type ParseCode = (Type extends Types.Context ? ContextParser : Type extends Types.Array ? ArrayParser : Type extends Types.Const ? ConstParser : Type extends Types.Ident ? IdentParser : Type extends Types.Number ? NumberParser : Type extends Types.Optional ? OptionalParser : Type extends Types.String ? StringParser : Type extends Types.Tuple ? TupleParser : Type extends Types.Union ? UnionParser : [ ]); type ParseMapping = ((Parser['mapping'] & { input: Result; context: Context; })['output']); /** Parses code with the given parser */ export type Parse = (ParseCode extends [infer L extends unknown, infer R extends string] ? [ParseMapping, R] : []); export {};