wsp-toolkit
Version:
Personal toolbox
29 lines (28 loc) • 1.43 kB
TypeScript
export type AnyFn = (...args: any[]) => any;
export type Head<T extends any[]> = T extends [any, ...any[]] ? T[0] : never;
export type HasTail<T extends any[]> = T extends [] | [any] ? false : true;
export type Last<T extends any[]> = {
0: Last<Tail<T>>;
1: Head<T>;
}[HasTail<T> extends true ? 0 : 1];
export type Tail<T extends any[]> = T extends [any, ...infer Rest] ? Rest : [];
export type Length<T extends any[]> = T["length"];
export type Prepend<E, T extends any[]> = [E] extends [never] ? T : [E, ...T];
export type Drop<N extends number, T extends any[], I extends any[] = []> = {
0: Drop<N, Tail<T>, Prepend<any, I>>;
1: T;
}[Length<I> extends N ? 1 : 0];
export type Cast<X, Y> = X extends Y ? X : Y;
export type Pos<I extends any[]> = Length<I>;
export type Next<I extends any[]> = Prepend<any, I>;
export type Prev<I extends any[]> = Tail<I>;
export type Iterator<Index extends number = 0, From extends any[] = [], I extends any[] = []> = {
0: Iterator<Index, Next<From>, Next<I>>;
1: From;
}[Pos<I> extends Index ? 1 : 0];
export type Reverse<T extends any[], R extends any[] = [], I extends any[] = []> = {
0: Reverse<T, Prepend<T[Pos<I>], R>, Next<I>>;
1: R;
}[Length<T> extends Pos<I> ? 1 : 0];
export type Concat<T, U> = T extends any[] ? U extends any[] ? [...T, ...U] : [...T, U] : U extends any[] ? [T, ...U] : [T, U];
export type Append<E, T extends any[]> = Concat<T, E>;