UNPKG

ts-data-forge

Version:

[![npm version](https://img.shields.io/npm/v/ts-data-forge.svg)](https://www.npmjs.com/package/ts-data-forge) [![npm downloads](https://img.shields.io/npm/dm/ts-data-forge.svg)](https://www.npmjs.com/package/ts-data-forge) [![License](https://img.shields.

375 lines 12.4 kB
import { IMap } from '../../collections/index.mjs'; /** * Creates a new array by transforming each element with a mapping function. * * @example * * ```ts * const numbers = [1, 2, 3] as const; * * const doubled = Arr.map(numbers, (value) => value * 2); * * const indexed = Arr.map<number, string>((value, index) => `${index}:${value}`)( * numbers, * ); * * assert.deepStrictEqual(doubled, [2, 4, 6]); * * assert.deepStrictEqual(indexed, ['0:1', '1:2', '2:3']); * ``` */ export declare function map<const Ar extends readonly unknown[], B>(array: Ar, mapFn: (a: Ar[number], index: ArrayIndex<Ar>) => B): Readonly<{ [K in keyof Ar]: B; }>; export declare function map<A, B>(mapFn: (a: A, index: SizeType.Arr) => B): <const Ar extends readonly A[]>(array: Ar) => Readonly<{ [K in keyof Ar]: B; }>; /** * Returns an array of successively reduced values from an array. * * @example * * ```ts * const changes = [5, -2, 3] as const; * * const runningTotals = Arr.scan(changes, (total, change) => total + change, 0); * * const runningTotalsFromCurried = Arr.scan( * (total: number, change: number) => total + change, * 10, * )([-5, 15]); * * const expectedTotals = [0, 5, 3, 6] as const; * * const expectedCurriedTotals = [10, 5, 20] as const; * * assert.deepStrictEqual(runningTotals, expectedTotals); * * assert.deepStrictEqual(runningTotalsFromCurried, expectedCurriedTotals); * ``` */ export declare function scan<const Ar extends readonly unknown[], S>(array: Ar, reducer: (accumulator: S, currentValue: Ar[number], currentIndex: ArrayIndex<Ar>) => S, init: S): NonEmptyArray<S>; export declare function scan<E, S>(reducer: (accumulator: S, currentValue: E, currentIndex: SizeType.Arr) => S, init: S): (array: readonly E[]) => NonEmptyArray<S>; /** * Reverses an array. * * @example * * ```ts * const tuple = [1, 'two', true] as const; * * const reversed = Arr.toReversed(tuple); * * const expected = [true, 'two', 1] as const; * * assert.deepStrictEqual(reversed, expected); * ``` */ export declare const toReversed: <const Ar extends readonly unknown[]>(array: Ar) => List.Reverse<Ar>; /** * Sorts an array. * * @example * * ```ts * const numbers = [3, 1, 2] as const; * * const words = ['banana', 'apple', 'cherry'] as const; * * const ascendingNumbers = Arr.toSorted(numbers); * * const alphabetical = Arr.toSorted(words, (left, right) => * left.localeCompare(right), * ); * * const expectedNumbers = [1, 2, 3] as const; * * const expectedWords = ['apple', 'banana', 'cherry'] as const; * * assert.deepStrictEqual(ascendingNumbers, expectedNumbers); * * assert.deepStrictEqual(alphabetical, expectedWords); * ``` */ export declare const toSorted: <const Ar extends readonly unknown[]>(...[array, comparator]: Ar extends readonly number[] ? readonly [array: Ar, comparator?: (x: Ar[number], y: Ar[number]) => number] : readonly [array: Ar, comparator: (x: Ar[number], y: Ar[number]) => number]) => IsFixedLengthList<Ar> extends true ? ArrayOfLength<Ar["length"], Ar[number]> : Ar extends NonEmptyArray<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][]; /** * Sorts an array by a mapped value. * * @example * * ```ts * const projects = [ * { name: 'compiler', issues: 7 }, * { name: 'docs', issues: 2 }, * { name: 'ui', issues: 5 }, * ] as const; * * const byIssueCount = Arr.toSortedBy(projects, (project) => project.issues); * * const byIssueCountDescending = Arr.toSortedBy( * projects, * (project) => project.issues, * (left, right) => right - left, * ); * * const expectedByIssues = [ * { name: 'docs', issues: 2 }, * { name: 'ui', issues: 5 }, * { name: 'compiler', issues: 7 }, * ] as const; * * const expectedByIssueCountDescending = [ * { name: 'compiler', issues: 7 }, * { name: 'ui', issues: 5 }, * { name: 'docs', issues: 2 }, * ] as const; * * assert.deepStrictEqual(byIssueCount, expectedByIssues); * * assert.deepStrictEqual(byIssueCountDescending, expectedByIssueCountDescending); * ``` */ export declare function toSortedBy<const Ar extends readonly unknown[]>(array: Ar, comparatorValueMapper: (value: Ar[number]) => number, comparator?: (x: number, y: number) => number): IsFixedLengthList<Ar> extends true ? ArrayOfLength<Ar['length'], Ar[number]> : Ar extends NonEmptyArray<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][]; export declare function toSortedBy<const Ar extends readonly unknown[], const V>(array: Ar, comparatorValueMapper: (value: Ar[number]) => V, comparator: (x: V, y: V) => number): IsFixedLengthList<Ar> extends true ? ArrayOfLength<Ar['length'], Ar[number]> : Ar extends NonEmptyArray<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][]; /** * Filters an array based on a predicate function. * * @example * * ```ts * const numbers = [1, 2, 3, 4] as const; * * const evens = Arr.filter(numbers, (value) => value % 2 === 0); * * const greaterThanTwo = Arr.filter<number>((value) => value > 2)(numbers); * * assert.deepStrictEqual(evens, [2, 4]); * * assert.deepStrictEqual(greaterThanTwo, [3, 4]); * ``` */ export declare function filter<const Ar extends readonly unknown[], S extends Ar[number]>(array: Ar, predicate: (a: Ar[number], index: ArrayIndex<Ar>) => a is S): readonly S[]; export declare function filter<E, S extends E>(predicate: (a: E, index: SizeType.Arr) => a is S): (array: readonly E[]) => readonly S[]; export declare function filter<const Ar extends readonly unknown[]>(array: Ar, predicate: (a: Ar[number], index: ArrayIndex<Ar>) => boolean): readonly Ar[number][]; export declare function filter<E>(predicate: (a: E, index: SizeType.Arr) => boolean): (array: readonly E[]) => readonly E[]; /** * Filters an array by excluding elements for which the predicate returns true. * * @example * * ```ts * const names = ['Ada', 'Grace', 'Linus'] as const; * * const notAda = Arr.filterNot(names, (name) => name === 'Ada'); * * const notShort = Arr.filterNot<string>((name) => name.length <= 4)(names); * * assert.deepStrictEqual(notAda, ['Grace', 'Linus']); * * assert.deepStrictEqual(notShort, ['Grace', 'Linus']); * ``` */ export declare function filterNot<const Ar extends readonly unknown[]>(array: Ar, predicate: (a: Ar[number], index: ArrayIndex<Ar>) => boolean): readonly Ar[number][]; export declare function filterNot<E>(predicate: (a: E, index: SizeType.Arr) => boolean): (array: readonly E[]) => readonly E[]; /** * Creates a new array with unique elements. * * @example * * ```ts * const letters = ['a', 'b', 'a', 'c', 'b'] as const; * * const uniqueLetters = Arr.uniq(letters); * * const expected = ['a', 'b', 'c'] as const; * * assert.deepStrictEqual(uniqueLetters, expected); * ``` */ export declare const uniq: <const Ar extends readonly Primitive[]>(array: Ar) => Ar extends NonEmptyArray<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][]; /** * Creates a new array with unique elements based on a mapped value. * * @example * * ```ts * const people = [ * { id: 1, name: 'Ada' }, * { id: 2, name: 'Brian' }, * { id: 1, name: 'Alan' }, * { id: 3, name: 'Grace' }, * ] as const; * * const uniqueById = Arr.uniqBy(people, (person) => person.id); * * const expected = [ * { id: 1, name: 'Ada' }, * { id: 2, name: 'Brian' }, * { id: 3, name: 'Grace' }, * ] as const; * * assert.deepStrictEqual(uniqueById, expected); * ``` */ export declare const uniqBy: <const Ar extends readonly unknown[], P extends Primitive>(array: Ar, mapFn: (value: Ar[number]) => P) => Ar extends NonEmptyArray<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][]; /** * Flattens nested arrays up to the specified depth. * * @example * * ```ts * const nested = [ * [1, 2], * [3, 4], * ] as const; * * const flatOnce = Arr.flat(nested, 1); * * const flatCurried = Arr.flat()(nested); * * assert.deepStrictEqual(flatOnce, [1, 2, 3, 4]); * * assert.deepStrictEqual(flatCurried, [1, 2, 3, 4]); * ``` */ export declare function flat<const Ar extends readonly unknown[], D extends SafeUintWithSmallInt = 1>(array: Ar, depth?: D): readonly FlatArray<Ar, D>[]; export declare function flat<D extends SafeUintWithSmallInt = 1>(depth?: number): <const Ar extends readonly unknown[]>(array: Ar) => readonly FlatArray<Ar, D>[]; /** * Maps each element and flattens the result. * * @example * * ```ts * const words = ['Ada', 'AI'] as const; * * const characters = Arr.flatMap(words, (word) => word.split('')); * * const labeled = Arr.flatMap<string, string>((word, index) => * word.split('').map((char) => `${index}-${char}`), * )(words); * * assert.deepStrictEqual(characters, ['A', 'd', 'a', 'A', 'I']); * * assert.deepStrictEqual(labeled, ['0-A', '0-d', '0-a', '1-A', '1-I']); * ``` */ export declare function flatMap<const Ar extends readonly unknown[], B>(array: Ar, mapFn: (a: Ar[number], index: ArrayIndex<Ar>) => readonly B[]): readonly B[]; export declare function flatMap<A, B>(mapFn: (a: A, index: SizeType.Arr) => readonly B[]): (array: readonly A[]) => readonly B[]; /** * Partitions an array into sub-arrays of a specified size. * * @example * * ```ts * const values = [1, 2, 3, 4, 5] as const; * * const pairs = Arr.partition(values, 2); * * const triples = Arr.partition(3)(values); * * const expectedPairs = [[1, 2], [3, 4], [5]] as const; * * assert.deepStrictEqual(pairs, expectedPairs); * * assert.deepStrictEqual(triples, [ * [1, 2, 3], * [4, 5], * ]); * * const pairs2 = Arr.chunk([1, 2, 3, 4, 5, 6], 2); * * assert.deepStrictEqual(pairs2, [ * [1, 2], * [3, 4], * [5, 6], * ]); * ``` */ export declare function partition<N extends WithSmallInt<PositiveInt & SizeType.Arr>, E>(array: readonly E[], chunkSize: N): readonly (readonly E[])[]; export declare function partition<N extends WithSmallInt<PositiveInt & SizeType.Arr>>(chunkSize: N): <E>(array: readonly E[]) => readonly (readonly E[])[]; /** * Concatenates two arrays. * * @example * * ```ts * const numbers = [1, 2] as const; * * const words = ['three', 'four'] as const; * * const combined = Arr.concat(numbers, words); * * const expectedCombined = [1, 2, 'three', 'four'] as const; * * assert.deepStrictEqual(combined, expectedCombined); * ``` */ export declare const concat: <const Ar1 extends readonly unknown[], const Ar2 extends readonly unknown[]>(array1: Ar1, array2: Ar2) => readonly [...Ar1, ...Ar2]; /** * Groups elements by a key derived from each element. * * @example * * ```ts * const animals = ['ant', 'bat', 'cat', 'dove'] as const; * * const groupedByLength = Arr.groupBy(animals, (animal) => animal.length); * * const groupedByFirstLetter = Arr.groupBy((animal: string) => animal[0])( * animals, * ); * * assert.deepStrictEqual( * groupedByLength.get(3), * Optional.some(['ant', 'bat', 'cat'] as const), * ); * * assert.deepStrictEqual( * groupedByLength.get(4), * Optional.some(['dove'] as const), * ); * * assert.deepStrictEqual(groupedByLength.get(5), Optional.none); * * assert.deepStrictEqual( * groupedByFirstLetter.get('a'), * Optional.some(['ant'] as const), * ); * * assert.deepStrictEqual( * groupedByFirstLetter.get('d'), * Optional.some(['dove'] as const), * ); * ``` */ export declare function groupBy<const Ar extends readonly unknown[], G extends MapSetKeyType>(array: Ar, grouper: (value: Ar[number], index: ArrayIndex<Ar>) => G): IMap<G, readonly Ar[number][]>; export declare function groupBy<E, G extends MapSetKeyType>(grouper: (value: E, index: SizeType.Arr) => G): (array: readonly E[]) => IMap<G, readonly E[]>; /** * Creates an array of tuples by pairing corresponding elements from two arrays. * * @example * * ```ts * const letters = ['a', 'b', 'c'] as const; * * const numbers = [1, 2, 3] as const; * * const pairs = Arr.zip(letters, numbers); * * const expectedPairs = [ * ['a', 1], * ['b', 2], * ['c', 3], * ] as const; * * assert.deepStrictEqual(pairs, expectedPairs); * ``` */ export declare const zip: <const Ar1 extends readonly unknown[], const Ar2 extends readonly unknown[]>(array1: Ar1, array2: Ar2) => List.Zip<Ar1, Ar2>; /** * Alias for `partition`. * * @see {@link partition} */ export declare const chunk: typeof partition; //# sourceMappingURL=array-utils-transformation.d.mts.map