import { IsEmptyArray } from "./array"; import { IsReadonlyArray } from "./is-array"; import { IsTuple } from "./is-tuple"; type _Reverse< T extends readonly unknown[], Result extends readonly unknown[] = [] > = IsEmptyArray extends true ? Result : T extends readonly [...infer Rest extends readonly unknown[], infer First] ? _Reverse : Result; /** * Returns a new array with the elements in reverse order. * @example * ```ts * // [3, 2, 1] * type T0 = Reverse<[1, 2, 3]>; * // [3, 2, 1] * type T1 = Reverse; * ``` */ export type Reverse = IsTuple extends true ? _Reverse extends infer R extends readonly unknown[] ? IsReadonlyArray extends true ? Readonly : R : never : T;