Created
March 15, 2023 08:02
-
-
Save erodactyl/cc5596027c2c1e142cdee5ea21747d69 to your computer and use it in GitHub Desktop.
Sorting an array using only the ts type system.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type Iterate<T extends number, A extends number[] = []> = A["length"] extends T | |
? A | |
: Iterate<T, [...A, A["length"]]>; | |
type StrictlyLonger<A extends any[], B extends any[]> = A extends [ | |
any, | |
...infer ATail | |
] | |
? B extends [any, ...infer BTail] | |
? StrictlyLonger<ATail, BTail> | |
: true | |
: false; | |
type Gt<A extends number, B extends number> = StrictlyLonger< | |
Iterate<A>, | |
Iterate<B> | |
>; | |
type Insert< | |
Right extends number[], | |
N extends number, | |
Left extends number[] = [] | |
> = Right extends [infer Head extends number, ...infer Tail extends number[]] | |
? Gt<Head, N> extends true | |
? [...Left, N, ...Right] | |
: Insert<Tail, N, [...Left, Head]> | |
: [...Left, N]; | |
type Sort<Arr extends number[], Sorted extends number[] = []> = Arr extends [ | |
infer Head extends number, | |
...infer Tail extends number[] | |
] | |
? Sort<Tail, Insert<Sorted, Head>> | |
: Sorted; | |
type test = Sort<[3, 2, 1, 2, 11, 8, 5, 2]>; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment