import type { Subtract } from './math/subtract' /** * ? HELPER * * @internal */ type _Internal_Flat_Fork = Tuple extends any[] ? _Internal_Flat> : readonly [Tuple] /** * ? MUTABLE * * @internal */ type _Internal_Flat = Depth extends 0 ? [...Tuple] : Tuple extends [infer A, ...infer B] ? [..._Internal_Flat_Fork, ..._Internal_Flat] : [...Tuple] /** * ? READONLY * * @internal */ type _Internal_FlatReadonly< Tuple extends readonly any[], Depth extends number > = Depth extends 0 ? readonly [...Tuple] : Tuple extends readonly [infer A, ...infer B] ? readonly [ ..._Internal_Flat_Fork, ..._Internal_FlatReadonly ] : readonly [...Tuple] /** * Recursively flatten an array up to a given depth. * * @param Tuple - The array to flatten. * @param Depth - The maximum recursion depth. * @defaultValue 1 * @example * ``` * type Foo = ['a0', [0, 1], 'a1', [0, ['b0']], 'a2'] * type FooFlatDepth1 = Flat // ["a0", 0, 1, "a1", 0, ["b0"], "a2"] * type FooFlatDepth2 = Flat // ["a0", 0, 1, "a1", 0, "b0", "a2"] * ``` */ export type Flat< Tuple extends any[] | readonly any[], Depth extends number = 1 > = Tuple extends any[] ? _Internal_Flat : _Internal_FlatReadonly