type ToArray<T extends string> = T extends ""
? []
: T extends `${infer A}${infer B}`
? [A, ...ToArray<B>]
: never;
type ToString<T extends any[]> = T extends [infer A, ...infer B]
? A extends string
? `${A}${ToString<B>}`
: ""
: "";
type Head<T extends any[]> = T extends [infer A, ...unknown[]] ? A : never;
type Tail<T extends any[]> = T extends [unknown, ...infer A] ? A : never;
type Init<T extends any[]> = T extends []
? never
: T extends [unknown]
? []
: T extends [infer A, ...infer B]
? [A, ...Init<B>]
: never;
type StrHead<T extends string> = Head<ToArray<T>>;
type StrTail<T extends string> = ToString<Tail<ToArray<T>>>;
type Tokenize<
T extends string,
Zero extends unknown[] = [],
One extends unknown[] = [],
R extends string = ""
> = Zero extends One
? Zero extends []
? StrHead<T> extends "0"
? Tokenize<StrTail<T>, [unknown, ...Zero], One, `${R}0`>
: Tokenize<StrTail<T>, Zero, [unknown, ...One], `${R}1`>
: T extends ""
? [R]
: [R, ...Tokenize<T>]
: StrHead<T> extends "0"
? Tokenize<StrTail<T>, [unknown, ...Zero], One, `${R}0`>
: Tokenize<StrTail<T>, Zero, [unknown, ...One], `${R}1`>;
type FirstWord<T extends string> = Head<ToArray<T>>;
type Shrink<T extends string> = ToString<Init<Tail<ToArray<T>>>>;
type Parse<T extends string[]> = T extends []
? []
: T extends [infer A, ...infer B]
? A extends string
? B extends string[]
? A extends ""
? []
: FirstWord<A> extends "0"
? [false, Parse<[Shrink<A>]>, true, Parse<B>]
: [true, Parse<[Shrink<A>]>, false, Parse<B>]
: never
: never
: never;
type Result = Parse<Tokenize<"0011010110">>;
런타임 안쓰고 타입추론만 써서 풀어봄
Turing complete
와 이게 뭐야
템플릿보다 어지럽노
타입스크립트에서 C++의 냄새가 나는데 왜죠 - dc App