import { type ArrayElement } from '@augment-vir/common'; import { type IsNever } from 'type-fest'; /** * The largest number in this tuple is the largest number of nestings of the same element that * `element-vir` will support with types (in runtime it'll support any level of nesting the same * element). * * @category Internal */ export type Incrementable = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ]; /** * Increments the given number. If an invalid type parameter is given, it is treated as `0` and this * will output `1`. If the upper bound of increments has been reached, this will output `never`. * * @category Internal */ export type Increment = IsNever, T>> extends true ? IsNever extends true ? 1 : never : Incrementable extends [any, ...infer Rest] ? T extends keyof Rest ? Rest[T] extends undefined ? never : Rest[T] : 1 : 1; /** * Decrements the given number. If an invalid type parameter is given, `never` is the output. * * @category Internal */ export type Decrement = IsNever, T>> extends true ? never : T extends keyof Incrementable ? [never, ...Incrementable][T] : never;