import type { Subtract } from './type-math.js'; import type { Expand } from './types.js'; /** * Filter an array by the types *not* assignable to `Predicate` * * @example ```ts * type nonempty = FilterOut<['example', 'with', 'empty', ''], ''>; // ['example', 'with', 'empty'] * ``` */ export type FilterOut = Arr extends readonly [infer Head, ...infer Rest] ? Head extends Predicate ? FilterOut : [Head, ...FilterOut] : []; /** * Filter an array by the types assignable to `Predicate` * * @example ```ts * type negatives = Filter<['-1', '2', '-3'], `-${number}`>; // ['-1', '-3'] * ``` */ export type Filter = Arr extends readonly [infer Head, ...infer Rest] ? Head extends Predicate ? [Head, ...Filter] : Filter : []; export type Some = Arr extends readonly [infer Head, ...infer Rest] ? Head extends Predicate ? true : Some : false; export type Every = Arr extends readonly [infer Head, ...infer Rest] ? Head extends Predicate ? Every : false : true; /** * Empty */ export type Empty = []; /** * Removes the first element of T and shifts */ export type Shift = T extends [unknown, ...infer Rest] ? Rest : never; /** * Gets the first element of T */ export type First = T extends [infer F, ...unknown[]] ? F : never; /** * Inserts V into T at the start of T */ export type Unshift = [V, ...T]; /** * Removes the last element of T */ export type Pop = T extends [...infer _, unknown] ? _ : never; /** * Gets the last element of T */ export type Last = T extends [...unknown[], infer Last] ? Last : never; /** * Appends V to T */ export type Push = [...T, V]; /** * Concatenates A and B */ export type Concat = Empty extends B ? A : Concat, Shift>; /** * Extracts from A what is not B * * @remarks * It does not remove duplicates (so Remove\<[0, 0, 0], [0, 0]\> yields [0]). This is intended and necessary behavior. */ export type Remove = Empty extends B ? A : Remove, Shift>; /** * The length of T */ export type Length = T extends { length: infer L extends number; } ? L : never; type _FromLength = Length extends N ? R : _FromLength>; /** * Creates a tuple of length N */ export type FromLength = _FromLength; /** * Gets the type of an array's members */ export type Member = D extends 0 ? T : T extends (infer U)[] ? Member : null> : T; /** * Flattens an array */ export type FlattenArray = A extends (infer U)[] ? Member, D>[] : A extends unknown[] ? { [K in keyof A]: Member; } : A; /** * Whether T is a tuple */ export type IsTuple = T extends [] ? false : T extends [infer _Head, ...infer _Rest] ? true : false; /** * Flattens a tuple */ export type FlattenTuple = A extends [infer U, ...infer Rest] ? U extends unknown[] ? [...U, ...FlattenTuple] : [U, ...FlattenTuple] : []; /** * Flattens an array or tuple */ export type Flatten = IsTuple extends true ? FlattenTuple : FlattenArray; type _Tuple = R['length'] extends N ? R : _Tuple; /** * Creates a tuple of T with length N */ export type Tuple = _Tuple; /** * Makes all members of the tuple T optional */ export type OptionalTuple = T extends [infer Head, ...infer Tail] ? [Head?, ...OptionalTuple] : T; /** * Converts an array of objects with a common key into a keyed object * * @example * ```ts * type ducksArray = [ * { name: 'Gerald', quacks: 6 }, * { name: 'Dorthy', quacks: 7 }, * ]; * * type ducks = FromKeyedArray; // { Gerald: { name: 'Gerald', quacks: 6 }, Dorthy: { name: 'Dorthy', quacks: 7 } } * ``` */ export type FromKeyed = A extends (infer Element)[] ? { [K in Element[KeyName] & PropertyKey]: Expand; } : never; export declare function chunkArray(array: readonly T[], chunkSize: number): T[][]; export {};