Skip to content

Instantly share code, notes, and snippets.

@erodactyl
Created March 15, 2023 08:02
Show Gist options
  • Save erodactyl/cc5596027c2c1e142cdee5ea21747d69 to your computer and use it in GitHub Desktop.
Save erodactyl/cc5596027c2c1e142cdee5ea21747d69 to your computer and use it in GitHub Desktop.
Sorting an array using only the ts type system.
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