Skip to content

Instantly share code, notes, and snippets.

@zaidmukaddam
Created September 19, 2022 04:16
Show Gist options
  • Save zaidmukaddam/963f04a6de67e2e84d16b399944bc01a to your computer and use it in GitHub Desktop.
Save zaidmukaddam/963f04a6de67e2e84d16b399944bc01a to your computer and use it in GitHub Desktop.
type BubbleSort<
A extends any[], Curr extends number = A["length"]
> = Curr extends 1
? A
: A extends [infer F, infer S, ...infer Rest]
? BubbleSort<
[
...(M.Comparator<M.Num<F>, M.Num<S>> extends true
? [S, ...BubbleSort<[F, ...Rest], M.Sub<Curr, 1>>]
: [F, ...BubbleSort<[S, ...Rest], M.Sub<Curr, 1>>])
],
M.Sub<Curr, 1>
>
: never;
type Demo = BubbleSort<[234, 43, 55, 63, 5, 6, 235, 547]>;
namespace M {
export type Num<T> = Extract<T, number>;
type Length<T extends any[]> = T["length"];
type Push<T extends any[], Val> = [...T, Val];
type NTuple<N extends number, T extends any[] = []> = T["length"] extends N
? T
: NTuple<N, Push<T, any>>;
export type Add<A extends number, B extends number> = Length<
[...NTuple<A>, ...NTuple<B>]
>;
export type Sub<A extends number, B extends number> = NTuple<A> extends [
...infer U,
...NTuple<B>
]
? Length<U>
: never;
export type Comparator<N1 extends number, N2 extends number> = N1 extends N2
? false
: [Sub<N2, N1>] extends [never]
? true
: false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment