Skip to content

Instantly share code, notes, and snippets.

@Zomatree
Created February 8, 2024 15:49
Show Gist options
  • Save Zomatree/db5239931f5fe2ddcde73f4d048a5470 to your computer and use it in GitHub Desktop.
Save Zomatree/db5239931f5fe2ddcde73f4d048a5470 to your computer and use it in GitHub Desktop.
type StringFlags = "c" | "b" | "B";
type NumberFlags = "n"
type Resolve<T extends string> = (
T extends StringFlags ? [string] :
T extends NumberFlags ? [number] :
[] // ignore stuff like ">"
);
type Repeat<
T extends unknown[],
Count extends string,
Result extends unknown[] = [],
> = (
`${Result["length"]}` extends Count
? Result
: Repeat<T, Count, [...T, ...Result]>
)
type Parse<
Input extends string,
Result extends unknown[] = [],
CurrentNumber extends string = "",
> = (
Input extends ""
? Result
: Input extends `${infer Digit extends number}${infer Rest}`
? Parse<Rest, Result, `${CurrentNumber}${Digit}`>
: Input extends `${infer Next}${infer Rest}`
? CurrentNumber extends ""
? Parse<Rest, [...Result, ...Resolve<Next>]>
: Parse<Rest, [...Result, ...Repeat<Resolve<Next>, CurrentNumber>]>
: never
);
type Foo = Parse<">5c22n">
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment