ts-data-forge 13.0.0 → 14.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/array/impl/array-utils-creation.d.mts +2 -2
- package/dist/array/impl/array-utils-creation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-creation.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-cast.d.mts +56 -29
- package/dist/array/impl/array-utils-length-bounded-array-cast.d.mts.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-cast.mjs +23 -15
- package/dist/array/impl/array-utils-length-bounded-array-cast.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-guard.d.mts +126 -28
- package/dist/array/impl/array-utils-length-bounded-array-guard.d.mts.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-guard.mjs +39 -5
- package/dist/array/impl/array-utils-length-bounded-array-guard.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.d.mts +167 -0
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.d.mts.map +1 -0
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.mjs +87 -0
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.mjs.map +1 -0
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.d.mts +135 -0
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.d.mts.map +1 -0
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs +41 -0
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs.map +1 -0
- package/dist/array/impl/array-utils-modification.d.mts +45 -18
- package/dist/array/impl/array-utils-modification.d.mts.map +1 -1
- package/dist/array/impl/array-utils-modification.mjs.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.d.mts +3 -3
- package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.mjs +1 -1
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
- package/dist/array/impl/array-utils-slice-clamped.d.mts.map +1 -1
- package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
- package/dist/array/impl/array-utils-slicing.d.mts +11 -11
- package/dist/array/impl/array-utils-slicing.d.mts.map +1 -1
- package/dist/array/impl/array-utils-slicing.mjs +1 -1
- package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
- package/dist/array/impl/array-utils-transformation.d.mts +36 -19
- package/dist/array/impl/array-utils-transformation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-transformation.mjs +2 -2
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
- package/dist/array/impl/array-utils-validation.d.mts +2 -124
- package/dist/array/impl/array-utils-validation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-validation.mjs +1 -7
- package/dist/array/impl/array-utils-validation.mjs.map +1 -1
- package/dist/array/impl/index.d.mts +2 -0
- package/dist/array/impl/index.d.mts.map +1 -1
- package/dist/array/impl/index.mjs +5 -3
- package/dist/array/impl/index.mjs.map +1 -1
- package/dist/collections/imap.d.mts +1 -1
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.d.mts +2 -2
- package/dist/collections/iset-mapped.d.mts.map +1 -1
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.d.mts +2 -2
- package/dist/collections/iset.d.mts.map +1 -1
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/number/num-arithmetic-types.d.mts +2 -2
- package/dist/number/num-arithmetic-types.d.mts.map +1 -1
- package/dist/object/object.mjs +1 -1
- package/dist/string/str.d.mts +44 -44
- package/dist/string/str.d.mts.map +1 -1
- package/dist/string/str.mjs +17 -17
- package/dist/string/str.mjs.map +1 -1
- package/package.json +4 -5
- package/src/array/impl/array-utils-creation.mts +7 -3
- package/src/array/impl/array-utils-creation.test.mts +10 -8
- package/src/array/impl/array-utils-length-bounded-array-cast.mts +88 -50
- package/src/array/impl/array-utils-length-bounded-array-cast.test.mts +40 -13
- package/src/array/impl/array-utils-length-bounded-array-guard.mts +248 -39
- package/src/array/impl/array-utils-length-bounded-array-guard.test.mts +135 -24
- package/src/array/impl/array-utils-length-bounded-tuple-cast.mts +364 -0
- package/src/array/impl/array-utils-length-bounded-tuple-cast.test.mts +207 -0
- package/src/array/impl/array-utils-length-bounded-tuple-guard.mts +266 -0
- package/src/array/impl/array-utils-length-bounded-tuple-guard.test.mts +441 -0
- package/src/array/impl/array-utils-length-constraint-preservation.test.mts +287 -0
- package/src/array/impl/array-utils-modification.mts +84 -61
- package/src/array/impl/array-utils-modification.test.mts +145 -6
- package/src/array/impl/array-utils-reducing-value.mts +5 -5
- package/src/array/impl/array-utils-shape-invariants.test.mts +284 -0
- package/src/array/impl/array-utils-slice-clamped.mts +2 -1
- package/src/array/impl/array-utils-slicing.mts +65 -43
- package/src/array/impl/array-utils-slicing.test.mts +55 -0
- package/src/array/impl/array-utils-transformation.mts +91 -37
- package/src/array/impl/array-utils-transformation.test.mts +96 -23
- package/src/array/impl/array-utils-validation.mts +2 -162
- package/src/array/impl/array-utils-validation.test.mts +0 -371
- package/src/array/impl/index.mts +2 -0
- package/src/collections/imap.mts +1 -1
- package/src/collections/iset-mapped.mts +7 -3
- package/src/collections/iset.mts +7 -3
- package/src/collections/iset.test.mts +9 -6
- package/src/collections/queue.test.mts +1 -1
- package/src/number/num-arithmetic-types.mts +8 -4
- package/src/number/num.test.mts +2 -2
- package/src/string/str.mts +69 -69
- package/src/string/str.test.mts +40 -40
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils-reducing-value.mjs","sources":["../../../src/array/impl/array-utils-reducing-value.mts"],"sourcesContent":["import { isError } from '@sindresorhus/is';\nimport { type Int, type NonEmptyTuple, type Uint } from 'ts-type-forge';\nimport { IMap } from '../../collections/index.mjs';\nimport { Optional, Result } from '../../functional/index.mjs';\nimport { isString, isUndefined } from '../../guard/index.mjs';\nimport { asUint32, Num, Uint32 } from '../../number/index.mjs';\nimport { unknownToString } from '../../others/index.mjs';\nimport {\n type ArrayIndex,\n type MapSetKeyType,\n type SizeType,\n type Some,\n} from '../../types.mjs';\nimport { isNonEmpty } from './array-utils-validation.mjs';\n\n/**\n * Finds the minimum value in an array.\n *\n * @example\n *\n * ```ts\n * const values = [5, 3, 9] as const;\n *\n * const empty: readonly number[] = [] as const;\n *\n * const smallest = Arr.min(values);\n *\n * const none = Arr.min(empty);\n *\n * const custom = Arr.min(values, (a, b) => b - a);\n *\n * assert.deepStrictEqual(smallest, Optional.some(3));\n *\n * assert.deepStrictEqual(none, Optional.none);\n *\n * assert.deepStrictEqual(custom, Optional.some(9));\n * ```\n */\nexport function min<const Ar extends readonly number[]>(\n array: Ar,\n // If the array elements are numbers, comparator is optional.\n comparator?: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function min<const Ar extends readonly unknown[]>(\n array: Ar,\n comparator: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function min<E extends number>(\n array: readonly E[],\n comparator?: (x: E, y: E) => number,\n): Optional<E> {\n if (!isNonEmpty(array)) {\n return Optional.none;\n }\n\n const cmp = comparator ?? ((x, y) => Num.from(x) - Num.from(y));\n\n return Optional.some(\n array.reduce(\n (currentMin, curr) => (cmp(curr, currentMin) < 0 ? curr : currentMin),\n array[0],\n ),\n );\n}\n\n/**\n * Finds the maximum value in an array.\n *\n * @example\n *\n * ```ts\n * const values = [5, 3, 9] as const;\n *\n * const largest = Arr.max(values);\n *\n * const reversed = Arr.max(values, (a, b) => b - a);\n *\n * assert.deepStrictEqual(largest, Optional.some(9));\n *\n * assert.deepStrictEqual(reversed, Optional.some(3));\n * ```\n */\nexport function max<const Ar extends readonly number[]>(\n array: Ar,\n // If the array elements are numbers, comparator is optional.\n comparator?: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function max<const Ar extends readonly unknown[]>(\n array: Ar,\n comparator: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function max<E extends number>(\n array: readonly E[],\n comparator?: (x: E, y: E) => number,\n): Optional<E> {\n const cmp = comparator ?? ((x, y) => Num.from(x) - Num.from(y));\n\n // Find max by finding min with an inverted comparator\n return min(array, (x, y) => -cmp(x, y));\n}\n\n/**\n * Finds the element with the minimum mapped value.\n *\n * @example\n *\n * ```ts\n * const users = [\n * { id: 1, visits: 10 },\n * { id: 2, visits: 3 },\n * { id: 3, visits: 5 },\n * ] as const;\n *\n * const leastVisits = Arr.minBy(users, (user) => user.visits);\n *\n * const custom = Arr.minBy(\n * users,\n * (user) => user.visits,\n * (a, b) => b - a,\n * );\n *\n * assert.deepStrictEqual(leastVisits, Optional.some({ id: 2, visits: 3 }));\n *\n * assert.deepStrictEqual(custom, Optional.some({ id: 1, visits: 10 }));\n * ```\n */\nexport function minBy<const Ar extends readonly unknown[]>(\n array: Ar,\n // If the array elements are mapped to numbers, comparator is optional.\n comparatorValueMapper: (value: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function minBy<const Ar extends readonly unknown[], V>(\n array: Ar,\n comparatorValueMapper: (value: Ar[number]) => V,\n comparator: (x: V, y: V) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function minBy<E, V>(\n array: readonly E[],\n comparatorValueMapper: (value: E) => V,\n comparator?: (x: V, y: V) => number,\n): Optional<E> {\n return min(array, (x, y) =>\n comparator === undefined\n ? Num.from(comparatorValueMapper(x)) - Num.from(comparatorValueMapper(y))\n : comparator(comparatorValueMapper(x), comparatorValueMapper(y)),\n );\n}\n\n/**\n * Finds the element with the maximum mapped value.\n *\n * @example\n *\n * ```ts\n * const projects = [\n * { id: 'a', stars: 10 },\n * { id: 'b', stars: 30 },\n * { id: 'c', stars: 20 },\n * ] as const;\n *\n * const mostStars = Arr.maxBy(projects, (project) => project.stars);\n *\n * const smallestStars = Arr.maxBy(\n * projects,\n * (project) => project.stars,\n * (a, b) => b - a,\n * );\n *\n * assert.deepStrictEqual(mostStars, Optional.some({ id: 'b', stars: 30 }));\n *\n * assert.deepStrictEqual(\n * smallestStars,\n * Optional.some({ id: 'a', stars: 10 }),\n * );\n * ```\n */\nexport function maxBy<const Ar extends readonly unknown[]>(\n array: Ar,\n // If the array elements are mapped to numbers, comparator is optional.\n comparatorValueMapper: (value: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function maxBy<const Ar extends readonly unknown[], V>(\n array: Ar,\n comparatorValueMapper: (value: Ar[number]) => V,\n comparator: (x: V, y: V) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function maxBy<E, V>(\n array: readonly E[],\n comparatorValueMapper: (value: E) => V,\n comparator?: (x: V, y: V) => number,\n): Optional<E> {\n return max(array, (x, y) =>\n comparator === undefined\n ? Num.from(comparatorValueMapper(x)) - Num.from(comparatorValueMapper(y))\n : comparator(comparatorValueMapper(x), comparatorValueMapper(y)),\n );\n}\n\n/**\n * Counts the number of elements that satisfy a predicate.\n *\n * @example\n *\n * ```ts\n * const words = ['Ada', 'Grace', 'Linus'] as const;\n *\n * const longWords = Arr.count(words, (word) => word.length > 4);\n *\n * const withCurried = Arr.count<string>((word) => word.includes('a'))(words);\n *\n * assert.isTrue(longWords === 2);\n *\n * assert.isTrue(withCurried === 2);\n * ```\n */\nexport function count<const Ar extends readonly unknown[]>(\n array: Ar,\n predicate: (value: Ar[number], index: ArrayIndex<Ar>) => boolean,\n): SizeType.Arr;\n\nexport function count<E>(\n predicate: (value: E, index: SizeType.Arr) => boolean,\n): (array: readonly E[]) => SizeType.Arr;\n\nexport function count<E>(\n ...args:\n | readonly [\n array: readonly E[],\n predicate: (value: E, index: SizeType.Arr) => boolean,\n ]\n | readonly [predicate: (value: E, index: SizeType.Arr) => boolean]\n): SizeType.Arr | ((array: readonly E[]) => SizeType.Arr) {\n switch (args.length) {\n case 2:\n return countImpl(...args);\n\n case 1:\n return (array) => countImpl(array, ...args);\n }\n}\n\nconst countImpl = <E,>(\n array: readonly E[],\n predicate: (value: E, index: SizeType.Arr) => boolean,\n): SizeType.Arr =>\n array.reduce<Uint32>(\n (acc, curr, index) =>\n predicate(curr, asUint32(index)) ? Uint32.add(acc, 1) : acc,\n asUint32(0),\n );\n\n/**\n * Groups elements by a key and counts the elements in each group.\n *\n * @example\n *\n * ```ts\n * const words = ['Ada', 'Grace', 'Alan', 'Barbara'] as const;\n *\n * const counts = Arr.countBy(words, (word) => word.at(0));\n *\n * assert.deepStrictEqual(counts.get('A'), Optional.some(2));\n *\n * assert.deepStrictEqual(counts.get('G'), Optional.some(1));\n *\n * assert.deepStrictEqual(counts.get('B'), Optional.some(1));\n * ```\n */\nexport function countBy<\n const Ar extends readonly unknown[],\n G extends MapSetKeyType,\n>(\n array: Ar,\n grouper: (value: Ar[number], index: ArrayIndex<Ar>) => G,\n): IMap<G, ArrayIndex<Ar>>;\n\nexport function countBy<E, G extends MapSetKeyType>(\n grouper: (value: E, index: SizeType.Arr) => G,\n): (array: readonly E[]) => IMap<G, SizeType.Arr>;\n\nexport function countBy<E, G extends MapSetKeyType>(\n ...args:\n | readonly [\n array: readonly E[],\n grouper: (value: E, index: SizeType.Arr) => G,\n ]\n | readonly [grouper: (value: E, index: SizeType.Arr) => G]\n): IMap<G, SizeType.Arr> | ((array: readonly E[]) => IMap<G, SizeType.Arr>) {\n switch (args.length) {\n case 2:\n return countByImpl(...args);\n\n case 1:\n return (array) => countByImpl(array, ...args);\n }\n}\n\nconst countByImpl = <E, G extends MapSetKeyType>(\n array: readonly E[],\n grouper: (value: E, index: SizeType.Arr) => G,\n): IMap<G, SizeType.Arr> => {\n const mut_groups = new Map<G, SizeType.Arr>();\n\n for (const [index, e] of array.entries()) {\n const key = grouper(e, asUint32(index));\n\n const curr = mut_groups.get(key) ?? 0;\n\n mut_groups.set(key, asUint32(curr + 1));\n }\n\n return IMap.create(mut_groups);\n};\n\n/**\n * Reduces an array to a single value from left to right.\n *\n * @example\n *\n * ```ts\n * const words = ['Ada', 'Lovelace'] as const;\n *\n * const totalLength = Arr.foldl(words, (acc, word) => acc + word.length, 0);\n *\n * const concat = Arr.foldl<string | number, string>(\n * (acc, value) => `${acc}-${value}`,\n * 'items',\n * )(words);\n *\n * assert.isTrue(totalLength === 11);\n *\n * assert.isTrue(concat === 'items-Ada-Lovelace');\n * ```\n */\nexport function foldl<const Ar extends readonly unknown[], P>(\n array: Ar,\n callbackfn: (\n previousValue: P,\n currentValue: Ar[number],\n currentIndex: ArrayIndex<Ar>,\n ) => P,\n initialValue: P,\n): P;\n\nexport function foldl<E, P>(\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): (array: readonly E[]) => P;\n\nexport function foldl<E, P>(\n ...args:\n | readonly [\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n | readonly [\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n): P | ((array: readonly E[]) => P) {\n switch (args.length) {\n case 3:\n return foldlImpl(...args);\n\n case 2:\n return (array) => foldlImpl(array, ...args);\n }\n}\n\nconst foldlImpl = <E, P>(\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): P =>\n array.reduce(\n (prev, curr, index) => callbackfn(prev, curr, asUint32(index)),\n initialValue,\n );\n\n/**\n * Reduces an array to a single value from right to left.\n *\n * @example\n *\n * ```ts\n * const numbers = [1, 2, 3] as const;\n *\n * const subtractRight = Arr.foldr(numbers, (acc, value) => acc - value, 0);\n *\n * const joinFromRight = Arr.foldr<number, string>(\n * (acc, value) => `${acc}${value}`,\n * '',\n * )(numbers);\n *\n * assert.isTrue(subtractRight === -6);\n *\n * assert.isTrue(joinFromRight === '321');\n * ```\n */\nexport function foldr<const Ar extends readonly unknown[], P>(\n array: Ar,\n callbackfn: (\n previousValue: P,\n currentValue: Ar[number],\n currentIndex: ArrayIndex<Ar>,\n ) => P,\n initialValue: P,\n): P;\n\nexport function foldr<E, P>(\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): (array: readonly E[]) => P;\n\nexport function foldr<E, P>(\n ...args:\n | readonly [\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n | readonly [\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n): P | ((array: readonly E[]) => P) {\n switch (args.length) {\n case 3:\n return foldrImpl(...args);\n\n case 2:\n return (array) => foldrImpl(array, ...args);\n }\n}\n\nconst foldrImpl = <E, P>(\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): P =>\n array.reduceRight(\n (prev, curr, index) => callbackfn(prev, curr, asUint32(index)),\n initialValue,\n );\n\n/**\n * Calculates the sum of numbers in an array.\n *\n * @example\n *\n * ```ts\n * const numbers = [1, 2, 3, 4] as const;\n *\n * const negatives = [3, -2, 5] as const;\n *\n * const total = Arr.sum(numbers);\n *\n * const totalNegatives = Arr.sum(negatives);\n *\n * assert.isTrue(total === 10);\n *\n * assert.isTrue(totalNegatives === 6);\n * ```\n */\nexport function sum(array: readonly []): 0;\n\nexport function sum<N extends number>(array: readonly [N]): N;\n\nexport function sum(array: readonly Uint[]): Uint;\n\nexport function sum(array: readonly Int[]): Int;\n\nexport function sum(array: readonly number[]): number;\n\nexport function sum(array: readonly number[]): number {\n return array.reduce((prev, curr) => prev + curr, 0);\n}\n\n/**\n * Calculates the sum of values in an array by applying a mapping function to each element.\n *\n * @example\n *\n * ```ts\n * const numbers = [\n * { value: 1 },\n * { value: 2 },\n * { value: 3 },\n * { value: 4 },\n * ] as const;\n *\n * const negatives = [{ value: 3 }, { value: -2 }, { value: 5 }] as const;\n *\n * const total = Arr.sumBy(numbers, (item) => item.value);\n *\n * const totalNegatives = Arr.sumBy(negatives, (item) => item.value);\n *\n * assert.isTrue(total === 10);\n *\n * assert.isTrue(totalNegatives === 6);\n * ```\n */\nexport function sumBy(array: readonly [], mapFn: (item: unknown) => number): 0;\n\nexport function sumBy<N extends Uint, E>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): Uint;\n\nexport function sumBy<N extends Int, E>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): Int;\n\nexport function sumBy<N extends number, E>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): number;\n\nexport function sumBy<N extends number, E>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): number {\n return array.reduce((prev, curr) => prev + mapFn(curr), 0);\n}\n\n/**\n * Joins array elements into a string.\n *\n * @example\n *\n * ```ts\n * const numbers = [1, 2, 3] as const;\n *\n * const defaultSeparator = Arr.join(numbers);\n *\n * const hyphenSeparated = Arr.join(numbers, '-');\n *\n * assert.deepStrictEqual(defaultSeparator, Result.ok('1,2,3'));\n *\n * assert.deepStrictEqual(hyphenSeparated, Result.ok('1-2-3'));\n * ```\n */\nexport function join(\n array: readonly unknown[],\n separator?: string,\n): Result<string, Error>;\n\nexport function join(\n separator?: string,\n): (array: readonly unknown[]) => Result<string, Error>;\n\nexport function join(\n ...args:\n | readonly [array: readonly unknown[], separator?: string]\n | readonly [separator?: string]\n):\n | Result<string, Error>\n | ((array: readonly unknown[]) => Result<string, Error>) {\n switch (args.length) {\n case 0:\n return (array) => joinImpl(array, undefined);\n\n case 1: {\n const [arg] = args;\n\n if (isString(arg) || isUndefined(arg)) {\n return (array) => joinImpl(array, arg);\n }\n\n return joinImpl(arg, undefined);\n }\n\n case 2: {\n const [array, separator] = args;\n\n return joinImpl(array, separator);\n }\n }\n}\n\nconst joinImpl = (\n array: readonly unknown[],\n separator: string | undefined,\n): Result<string, Error> => {\n try {\n const result = array.join(separator);\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(\n isError(error) ? error : new Error(unknownToString(error)),\n );\n }\n};\n\n/**\n * Alias for `foldl`.\n *\n * @see {@link foldl}\n */\nexport const reduce = foldl;\n\n/**\n * Alias for `foldr`.\n *\n * @see {@link foldr}\n */\nexport const reduceRight = foldr;\n"],"names":["Optional.none","Optional.some","Result.ok","Result.err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"array-utils-reducing-value.mjs","sources":["../../../src/array/impl/array-utils-reducing-value.mts"],"sourcesContent":["import { isError } from '@sindresorhus/is';\nimport { type Int, type NonEmptyTuple, type Uint } from 'ts-type-forge';\nimport { IMap } from '../../collections/index.mjs';\nimport { Optional, Result } from '../../functional/index.mjs';\nimport { isString, isUndefined } from '../../guard/index.mjs';\nimport { asUint32, Num, Uint32 } from '../../number/index.mjs';\nimport { unknownToString } from '../../others/index.mjs';\nimport {\n type ArrayIndex,\n type MapSetKeyType,\n type SizeType,\n type Some,\n} from '../../types.mjs';\nimport { isNonEmpty } from './array-utils-length-bounded-array-guard.mjs';\n\n/**\n * Finds the minimum value in an array.\n *\n * @example\n *\n * ```ts\n * const values = [5, 3, 9] as const;\n *\n * const empty: readonly number[] = [] as const;\n *\n * const smallest = Arr.min(values);\n *\n * const none = Arr.min(empty);\n *\n * const custom = Arr.min(values, (a, b) => b - a);\n *\n * assert.deepStrictEqual(smallest, Optional.some(3));\n *\n * assert.deepStrictEqual(none, Optional.none);\n *\n * assert.deepStrictEqual(custom, Optional.some(9));\n * ```\n */\nexport function min<const Ar extends readonly number[]>(\n array: Ar,\n // If the array elements are numbers, comparator is optional.\n comparator?: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function min<const Ar extends readonly unknown[]>(\n array: Ar,\n comparator: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function min<E extends number>(\n array: readonly E[],\n comparator?: (x: E, y: E) => number,\n): Optional<E> {\n if (!isNonEmpty(array)) {\n return Optional.none;\n }\n\n const cmp = comparator ?? ((x, y) => Num.from(x) - Num.from(y));\n\n return Optional.some(\n array.reduce(\n (currentMin, curr) => (cmp(curr, currentMin) < 0 ? curr : currentMin),\n array[0],\n ),\n );\n}\n\n/**\n * Finds the maximum value in an array.\n *\n * @example\n *\n * ```ts\n * const values = [5, 3, 9] as const;\n *\n * const largest = Arr.max(values);\n *\n * const reversed = Arr.max(values, (a, b) => b - a);\n *\n * assert.deepStrictEqual(largest, Optional.some(9));\n *\n * assert.deepStrictEqual(reversed, Optional.some(3));\n * ```\n */\nexport function max<const Ar extends readonly number[]>(\n array: Ar,\n // If the array elements are numbers, comparator is optional.\n comparator?: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function max<const Ar extends readonly unknown[]>(\n array: Ar,\n comparator: (x: Ar[number], y: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function max<E extends number>(\n array: readonly E[],\n comparator?: (x: E, y: E) => number,\n): Optional<E> {\n const cmp = comparator ?? ((x, y) => Num.from(x) - Num.from(y));\n\n // Find max by finding min with an inverted comparator\n return min(array, (x, y) => -cmp(x, y));\n}\n\n/**\n * Finds the element with the minimum mapped value.\n *\n * @example\n *\n * ```ts\n * const users = [\n * { id: 1, visits: 10 },\n * { id: 2, visits: 3 },\n * { id: 3, visits: 5 },\n * ] as const;\n *\n * const leastVisits = Arr.minBy(users, (user) => user.visits);\n *\n * const custom = Arr.minBy(\n * users,\n * (user) => user.visits,\n * (a, b) => b - a,\n * );\n *\n * assert.deepStrictEqual(leastVisits, Optional.some({ id: 2, visits: 3 }));\n *\n * assert.deepStrictEqual(custom, Optional.some({ id: 1, visits: 10 }));\n * ```\n */\nexport function minBy<const Ar extends readonly unknown[]>(\n array: Ar,\n // If the array elements are mapped to numbers, comparator is optional.\n comparatorValueMapper: (value: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function minBy<const Ar extends readonly unknown[], V>(\n array: Ar,\n comparatorValueMapper: (value: Ar[number]) => V,\n comparator: (x: V, y: V) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function minBy<E, V>(\n array: readonly E[],\n comparatorValueMapper: (value: E) => V,\n comparator?: (x: V, y: V) => number,\n): Optional<E> {\n return min(array, (x, y) =>\n comparator === undefined\n ? Num.from(comparatorValueMapper(x)) - Num.from(comparatorValueMapper(y))\n : comparator(comparatorValueMapper(x), comparatorValueMapper(y)),\n );\n}\n\n/**\n * Finds the element with the maximum mapped value.\n *\n * @example\n *\n * ```ts\n * const projects = [\n * { id: 'a', stars: 10 },\n * { id: 'b', stars: 30 },\n * { id: 'c', stars: 20 },\n * ] as const;\n *\n * const mostStars = Arr.maxBy(projects, (project) => project.stars);\n *\n * const smallestStars = Arr.maxBy(\n * projects,\n * (project) => project.stars,\n * (a, b) => b - a,\n * );\n *\n * assert.deepStrictEqual(mostStars, Optional.some({ id: 'b', stars: 30 }));\n *\n * assert.deepStrictEqual(\n * smallestStars,\n * Optional.some({ id: 'a', stars: 10 }),\n * );\n * ```\n */\nexport function maxBy<const Ar extends readonly unknown[]>(\n array: Ar,\n // If the array elements are mapped to numbers, comparator is optional.\n comparatorValueMapper: (value: Ar[number]) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function maxBy<const Ar extends readonly unknown[], V>(\n array: Ar,\n comparatorValueMapper: (value: Ar[number]) => V,\n comparator: (x: V, y: V) => number,\n): Ar extends NonEmptyTuple<unknown> ? Some<Ar[number]> : Optional<Ar[number]>;\n\nexport function maxBy<E, V>(\n array: readonly E[],\n comparatorValueMapper: (value: E) => V,\n comparator?: (x: V, y: V) => number,\n): Optional<E> {\n return max(array, (x, y) =>\n comparator === undefined\n ? Num.from(comparatorValueMapper(x)) - Num.from(comparatorValueMapper(y))\n : comparator(comparatorValueMapper(x), comparatorValueMapper(y)),\n );\n}\n\n/**\n * Counts the number of elements that satisfy a predicate.\n *\n * @example\n *\n * ```ts\n * const words = ['Ada', 'Grace', 'Linus'] as const;\n *\n * const longWords = Arr.count(words, (word) => word.length > 4);\n *\n * const withCurried = Arr.count<string>((word) => word.includes('a'))(words);\n *\n * assert.isTrue(longWords === 2);\n *\n * assert.isTrue(withCurried === 2);\n * ```\n */\nexport function count<const Ar extends readonly unknown[]>(\n array: Ar,\n predicate: (value: Ar[number], index: ArrayIndex<Ar>) => boolean,\n): SizeType.Arr;\n\nexport function count<E>(\n predicate: (value: E, index: SizeType.Arr) => boolean,\n): (array: readonly E[]) => SizeType.Arr;\n\nexport function count<E>(\n ...args:\n | readonly [\n array: readonly E[],\n predicate: (value: E, index: SizeType.Arr) => boolean,\n ]\n | readonly [predicate: (value: E, index: SizeType.Arr) => boolean]\n): SizeType.Arr | ((array: readonly E[]) => SizeType.Arr) {\n switch (args.length) {\n case 2:\n return countImpl(...args);\n\n case 1:\n return (array) => countImpl(array, ...args);\n }\n}\n\nconst countImpl = <E,>(\n array: readonly E[],\n predicate: (value: E, index: SizeType.Arr) => boolean,\n): SizeType.Arr =>\n array.reduce<Uint32>(\n (acc, curr, index) =>\n predicate(curr, asUint32(index)) ? Uint32.add(acc, 1) : acc,\n asUint32(0),\n );\n\n/**\n * Groups elements by a key and counts the elements in each group.\n *\n * @example\n *\n * ```ts\n * const words = ['Ada', 'Grace', 'Alan', 'Barbara'] as const;\n *\n * const counts = Arr.countBy(words, (word) => word.at(0));\n *\n * assert.deepStrictEqual(counts.get('A'), Optional.some(2));\n *\n * assert.deepStrictEqual(counts.get('G'), Optional.some(1));\n *\n * assert.deepStrictEqual(counts.get('B'), Optional.some(1));\n * ```\n */\nexport function countBy<\n const Ar extends readonly unknown[],\n G extends MapSetKeyType,\n>(\n array: Ar,\n grouper: (value: Ar[number], index: ArrayIndex<Ar>) => G,\n): IMap<G, ArrayIndex<Ar>>;\n\nexport function countBy<E, G extends MapSetKeyType>(\n grouper: (value: E, index: SizeType.Arr) => G,\n): (array: readonly E[]) => IMap<G, SizeType.Arr>;\n\nexport function countBy<E, G extends MapSetKeyType>(\n ...args:\n | readonly [\n array: readonly E[],\n grouper: (value: E, index: SizeType.Arr) => G,\n ]\n | readonly [grouper: (value: E, index: SizeType.Arr) => G]\n): IMap<G, SizeType.Arr> | ((array: readonly E[]) => IMap<G, SizeType.Arr>) {\n switch (args.length) {\n case 2:\n return countByImpl(...args);\n\n case 1:\n return (array) => countByImpl(array, ...args);\n }\n}\n\nconst countByImpl = <E, G extends MapSetKeyType>(\n array: readonly E[],\n grouper: (value: E, index: SizeType.Arr) => G,\n): IMap<G, SizeType.Arr> => {\n const mut_groups = new Map<G, SizeType.Arr>();\n\n for (const [index, e] of array.entries()) {\n const key = grouper(e, asUint32(index));\n\n const curr = mut_groups.get(key) ?? 0;\n\n mut_groups.set(key, asUint32(curr + 1));\n }\n\n return IMap.create(mut_groups);\n};\n\n/**\n * Reduces an array to a single value from left to right.\n *\n * @example\n *\n * ```ts\n * const words = ['Ada', 'Lovelace'] as const;\n *\n * const totalLength = Arr.foldl(words, (acc, word) => acc + word.length, 0);\n *\n * const concat = Arr.foldl<string | number, string>(\n * (acc, value) => `${acc}-${value}`,\n * 'items',\n * )(words);\n *\n * assert.isTrue(totalLength === 11);\n *\n * assert.isTrue(concat === 'items-Ada-Lovelace');\n * ```\n */\nexport function foldl<const Ar extends readonly unknown[], P>(\n array: Ar,\n callbackfn: (\n previousValue: P,\n currentValue: Ar[number],\n currentIndex: ArrayIndex<Ar>,\n ) => P,\n initialValue: P,\n): P;\n\nexport function foldl<E, P>(\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): (array: readonly E[]) => P;\n\nexport function foldl<E, P>(\n ...args:\n | readonly [\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n | readonly [\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n): P | ((array: readonly E[]) => P) {\n switch (args.length) {\n case 3:\n return foldlImpl(...args);\n\n case 2:\n return (array) => foldlImpl(array, ...args);\n }\n}\n\nconst foldlImpl = <E, P>(\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): P =>\n array.reduce(\n (prev, curr, index) => callbackfn(prev, curr, asUint32(index)),\n initialValue,\n );\n\n/**\n * Reduces an array to a single value from right to left.\n *\n * @example\n *\n * ```ts\n * const numbers = [1, 2, 3] as const;\n *\n * const subtractRight = Arr.foldr(numbers, (acc, value) => acc - value, 0);\n *\n * const joinFromRight = Arr.foldr<number, string>(\n * (acc, value) => `${acc}${value}`,\n * '',\n * )(numbers);\n *\n * assert.isTrue(subtractRight === -6);\n *\n * assert.isTrue(joinFromRight === '321');\n * ```\n */\nexport function foldr<const Ar extends readonly unknown[], P>(\n array: Ar,\n callbackfn: (\n previousValue: P,\n currentValue: Ar[number],\n currentIndex: ArrayIndex<Ar>,\n ) => P,\n initialValue: P,\n): P;\n\nexport function foldr<E, P>(\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): (array: readonly E[]) => P;\n\nexport function foldr<E, P>(\n ...args:\n | readonly [\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n | readonly [\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n ]\n): P | ((array: readonly E[]) => P) {\n switch (args.length) {\n case 3:\n return foldrImpl(...args);\n\n case 2:\n return (array) => foldrImpl(array, ...args);\n }\n}\n\nconst foldrImpl = <E, P>(\n array: readonly E[],\n callbackfn: (\n previousValue: P,\n currentValue: E,\n currentIndex: SizeType.Arr,\n ) => P,\n initialValue: P,\n): P =>\n array.reduceRight(\n (prev, curr, index) => callbackfn(prev, curr, asUint32(index)),\n initialValue,\n );\n\n/**\n * Calculates the sum of numbers in an array.\n *\n * @example\n *\n * ```ts\n * const numbers = [1, 2, 3, 4] as const;\n *\n * const negatives = [3, -2, 5] as const;\n *\n * const total = Arr.sum(numbers);\n *\n * const totalNegatives = Arr.sum(negatives);\n *\n * assert.isTrue(total === 10);\n *\n * assert.isTrue(totalNegatives === 6);\n * ```\n */\nexport function sum(array: readonly []): 0;\n\nexport function sum<N extends number>(array: readonly [N]): N;\n\nexport function sum(array: readonly Uint[]): Uint;\n\nexport function sum(array: readonly Int[]): Int;\n\nexport function sum(array: readonly number[]): number;\n\nexport function sum(array: readonly number[]): number {\n return array.reduce((prev, curr) => prev + curr, 0);\n}\n\n/**\n * Calculates the sum of values in an array by applying a mapping function to each element.\n *\n * @example\n *\n * ```ts\n * const numbers = [\n * { value: 1 },\n * { value: 2 },\n * { value: 3 },\n * { value: 4 },\n * ] as const;\n *\n * const negatives = [{ value: 3 }, { value: -2 }, { value: 5 }] as const;\n *\n * const total = Arr.sumBy(numbers, (item) => item.value);\n *\n * const totalNegatives = Arr.sumBy(negatives, (item) => item.value);\n *\n * assert.isTrue(total === 10);\n *\n * assert.isTrue(totalNegatives === 6);\n * ```\n */\nexport function sumBy(array: readonly [], mapFn: (item: unknown) => number): 0;\n\nexport function sumBy<E, N extends Uint>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): Uint;\n\nexport function sumBy<E, N extends Int>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): Int;\n\nexport function sumBy<E, N extends number>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): number;\n\nexport function sumBy<E, N extends number>(\n array: readonly E[],\n mapFn: (item: E) => N,\n): number {\n return array.reduce((prev, curr) => prev + mapFn(curr), 0);\n}\n\n/**\n * Joins array elements into a string.\n *\n * @example\n *\n * ```ts\n * const numbers = [1, 2, 3] as const;\n *\n * const defaultSeparator = Arr.join(numbers);\n *\n * const hyphenSeparated = Arr.join(numbers, '-');\n *\n * assert.deepStrictEqual(defaultSeparator, Result.ok('1,2,3'));\n *\n * assert.deepStrictEqual(hyphenSeparated, Result.ok('1-2-3'));\n * ```\n */\nexport function join(\n array: readonly unknown[],\n separator?: string,\n): Result<string, Error>;\n\nexport function join(\n separator?: string,\n): (array: readonly unknown[]) => Result<string, Error>;\n\nexport function join(\n ...args:\n | readonly [array: readonly unknown[], separator?: string]\n | readonly [separator?: string]\n):\n | Result<string, Error>\n | ((array: readonly unknown[]) => Result<string, Error>) {\n switch (args.length) {\n case 0:\n return (array) => joinImpl(array, undefined);\n\n case 1: {\n const [arg] = args;\n\n if (isString(arg) || isUndefined(arg)) {\n return (array) => joinImpl(array, arg);\n }\n\n return joinImpl(arg, undefined);\n }\n\n case 2: {\n const [array, separator] = args;\n\n return joinImpl(array, separator);\n }\n }\n}\n\nconst joinImpl = (\n array: readonly unknown[],\n separator: string | undefined,\n): Result<string, Error> => {\n try {\n const result = array.join(separator);\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(\n isError(error) ? error : new Error(unknownToString(error)),\n );\n }\n};\n\n/**\n * Alias for `foldl`.\n *\n * @see {@link foldl}\n */\nexport const reduce = foldl;\n\n/**\n * Alias for `foldr`.\n *\n * @see {@link foldr}\n */\nexport const reduceRight = foldr;\n"],"names":["Optional.none","Optional.some","Result.ok","Result.err"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils-slice-clamped.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-slice-clamped.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"array-utils-slice-clamped.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-slice-clamped.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,yBAAyB,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAC9D,KAAK,EAAE,EAAE,EACT,KAAK,EAAE,yBAAyB,CAAC,EAAE,CAAC,EACpC,GAAG,EAAE,yBAAyB,CAAC,EAAE,CAAC,GACjC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAEzB,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,CAAC,kBAAkB,EAClC,GAAG,EAAE,QAAQ,CAAC,kBAAkB,GAC/B,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils-slice-clamped.mjs","sources":["../../../src/array/impl/array-utils-slice-clamped.mts"],"sourcesContent":["import { Num } from '../../number/index.mjs';\nimport { type ArgArrayIndexWithNegative, type SizeType } from '../../types.mjs';\n\n/**\n * Slices an array with automatically clamped start and end indices.\n *\n * @example\n *\n * ```ts\n * const letters = ['a', 'b', 'c', 'd', 'e'] as readonly string[];\n *\n * const lastThree = Arr.sliceClamped(letters, -3, 10);\n *\n * const middleTwo = Arr.sliceClamped(1, 3)(letters);\n *\n * assert.deepStrictEqual(lastThree, ['a', 'b', 'c', 'd', 'e']);\n *\n * assert.deepStrictEqual(middleTwo, ['b', 'c']);\n * ```\n */\nexport function sliceClamped<const Ar extends readonly unknown[]>(\n array: Ar,\n start: ArgArrayIndexWithNegative<Ar>,\n end: ArgArrayIndexWithNegative<Ar>,\n): readonly Ar[number][];\n\nexport function sliceClamped(\n start: SizeType.ArgArrWithNegative,\n end: SizeType.ArgArrWithNegative,\n): <E>(array: readonly E[]) => readonly E[];\n\nexport function sliceClamped<E>(\n ...args:\n | readonly [\n readonly E[],\n SizeType.ArgArrWithNegative,\n SizeType.ArgArrWithNegative,\n ]\n |
|
|
1
|
+
{"version":3,"file":"array-utils-slice-clamped.mjs","sources":["../../../src/array/impl/array-utils-slice-clamped.mts"],"sourcesContent":["import { type FixedLengthTuple } from 'ts-type-forge';\nimport { Num } from '../../number/index.mjs';\nimport { type ArgArrayIndexWithNegative, type SizeType } from '../../types.mjs';\n\n/**\n * Slices an array with automatically clamped start and end indices.\n *\n * @example\n *\n * ```ts\n * const letters = ['a', 'b', 'c', 'd', 'e'] as readonly string[];\n *\n * const lastThree = Arr.sliceClamped(letters, -3, 10);\n *\n * const middleTwo = Arr.sliceClamped(1, 3)(letters);\n *\n * assert.deepStrictEqual(lastThree, ['a', 'b', 'c', 'd', 'e']);\n *\n * assert.deepStrictEqual(middleTwo, ['b', 'c']);\n * ```\n */\nexport function sliceClamped<const Ar extends readonly unknown[]>(\n array: Ar,\n start: ArgArrayIndexWithNegative<Ar>,\n end: ArgArrayIndexWithNegative<Ar>,\n): readonly Ar[number][];\n\nexport function sliceClamped(\n start: SizeType.ArgArrWithNegative,\n end: SizeType.ArgArrWithNegative,\n): <E>(array: readonly E[]) => readonly E[];\n\nexport function sliceClamped<E>(\n ...args:\n | readonly [\n readonly E[],\n SizeType.ArgArrWithNegative,\n SizeType.ArgArrWithNegative,\n ]\n | FixedLengthTuple<2, SizeType.ArgArrWithNegative>\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 3:\n return sliceClampedImpl(...args);\n\n case 2:\n return (array) => sliceClampedImpl(array, ...args);\n }\n}\n\nconst sliceClampedImpl = <E,>(\n array: readonly E[],\n start: SizeType.ArgArrWithNegative,\n end: SizeType.ArgArrWithNegative,\n): readonly E[] => {\n const startClamped = Num.clamp(0, array.length)(start);\n\n // Ensure endClamped is not less than startClamped.\n const endClamped = Num.clamp(startClamped, array.length)(end);\n\n return array.slice(startClamped, endClamped);\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCO,SAAS,gBACX,IAAA,EAOqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,gBAAA,CAAiB,GAAG,IAAI,CAAA;AAAA,IAEjC,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,gBAAA,CAAiB,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAEvD;AAEA,MAAM,gBAAA,GAAmB,CACvB,KAAA,EACA,KAAA,EACA,GAAA,KACiB;AACjB,EAAA,MAAM,eAAe,GAAA,CAAI,KAAA,CAAM,GAAG,KAAA,CAAM,MAAM,EAAE,KAAK,CAAA;AAGrD,EAAA,MAAM,aAAa,GAAA,CAAI,KAAA,CAAM,cAAc,KAAA,CAAM,MAAM,EAAE,GAAG,CAAA;AAE5D,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,YAAA,EAAc,UAAU,CAAA;AAC7C,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type List, type NonEmptyArray, type NonEmptyTuple, type StructuralPrefixLength } from 'ts-type-forge';
|
|
1
|
+
import { type ConstrainedList, type HasLengthConstraint, type List, type NonEmptyArray, type NonEmptyTuple, type StructuralPrefixLength } from 'ts-type-forge';
|
|
2
2
|
import { type SizeType } from '../../types.mjs';
|
|
3
3
|
/**
|
|
4
4
|
* Returns all elements of an array except the first one.
|
|
@@ -29,7 +29,7 @@ import { type SizeType } from '../../types.mjs';
|
|
|
29
29
|
* }
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
|
-
export declare const tail: <const Ar extends readonly unknown[]>(array: Ar) =>
|
|
32
|
+
export declare const tail: <const Ar extends readonly unknown[]>(array: Ar) => ConstrainedList.Tail<Ar>;
|
|
33
33
|
/**
|
|
34
34
|
* Returns all elements of an array except the last one.
|
|
35
35
|
*
|
|
@@ -45,7 +45,7 @@ export declare const tail: <const Ar extends readonly unknown[]>(array: Ar) => L
|
|
|
45
45
|
* assert.isTrue(withoutLast.length === 2);
|
|
46
46
|
* ```
|
|
47
47
|
*/
|
|
48
|
-
export declare const butLast: <const Ar extends readonly unknown[]>(array: Ar) =>
|
|
48
|
+
export declare const butLast: <const Ar extends readonly unknown[]>(array: Ar) => ConstrainedList.ButLast<Ar>;
|
|
49
49
|
/**
|
|
50
50
|
* Takes the first N elements from an array.
|
|
51
51
|
*
|
|
@@ -63,8 +63,8 @@ export declare const butLast: <const Ar extends readonly unknown[]>(array: Ar) =
|
|
|
63
63
|
* assert.deepStrictEqual(firstThree, [1, 2, 3]);
|
|
64
64
|
* ```
|
|
65
65
|
*/
|
|
66
|
-
export declare function take<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): N extends StructuralPrefixLength ? List.Take<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
67
|
-
export declare function take<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => N extends StructuralPrefixLength ? List.Take<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
66
|
+
export declare function take<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.Take<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
67
|
+
export declare function take<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.Take<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
68
68
|
/**
|
|
69
69
|
* Takes the last N elements from an array.
|
|
70
70
|
*
|
|
@@ -82,8 +82,8 @@ export declare function take<N extends SizeType.ArgArr>(num: N): <const Ar exten
|
|
|
82
82
|
* assert.deepStrictEqual(lastThree, [2, 3, 4]);
|
|
83
83
|
* ```
|
|
84
84
|
*/
|
|
85
|
-
export declare function takeLast<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): N extends StructuralPrefixLength ? List.TakeLast<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
86
|
-
export declare function takeLast<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => N extends StructuralPrefixLength ? List.TakeLast<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
85
|
+
export declare function takeLast<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.TakeLast<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
86
|
+
export declare function takeLast<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.TakeLast<N, Ar> : N extends SizeType.ArgArrPositive ? Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][] : readonly Ar[number][];
|
|
87
87
|
/**
|
|
88
88
|
* Skips the first N elements of an array.
|
|
89
89
|
*
|
|
@@ -101,8 +101,8 @@ export declare function takeLast<N extends SizeType.ArgArr>(num: N): <const Ar e
|
|
|
101
101
|
* assert.deepStrictEqual(withoutFirstThree, ['d']);
|
|
102
102
|
* ```
|
|
103
103
|
*/
|
|
104
|
-
export declare function skip<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): N extends StructuralPrefixLength ? List.Skip<N, Ar> : readonly Ar[number][];
|
|
105
|
-
export declare function skip<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => N extends StructuralPrefixLength ? List.Skip<N, Ar> : readonly Ar[number][];
|
|
104
|
+
export declare function skip<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.Skip<N, Ar> : readonly Ar[number][];
|
|
105
|
+
export declare function skip<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.Skip<N, Ar> : readonly Ar[number][];
|
|
106
106
|
/**
|
|
107
107
|
* Skips the last N elements of an array.
|
|
108
108
|
*
|
|
@@ -120,8 +120,8 @@ export declare function skip<N extends SizeType.ArgArr>(num: N): <const Ar exten
|
|
|
120
120
|
* assert.deepStrictEqual(withoutLastThree, ['a']);
|
|
121
121
|
* ```
|
|
122
122
|
*/
|
|
123
|
-
export declare function skipLast<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): N extends StructuralPrefixLength ? List.SkipLast<N, Ar> : readonly Ar[number][];
|
|
124
|
-
export declare function skipLast<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => N extends StructuralPrefixLength ? List.SkipLast<N, Ar> : readonly Ar[number][];
|
|
123
|
+
export declare function skipLast<const Ar extends readonly unknown[], N extends SizeType.ArgArr>(array: Ar, num: N): HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.SkipLast<N, Ar> : readonly Ar[number][];
|
|
124
|
+
export declare function skipLast<N extends SizeType.ArgArr>(num: N): <const Ar extends readonly unknown[]>(array: Ar) => HasLengthConstraint<Ar> extends true ? readonly Ar[number][] : N extends StructuralPrefixLength ? List.SkipLast<N, Ar> : readonly Ar[number][];
|
|
125
125
|
/**
|
|
126
126
|
* Alias for `tail`.
|
|
127
127
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils-slicing.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-slicing.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,IAAI,GAAI,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,SAC/C,EAAE,KACR,
|
|
1
|
+
{"version":3,"file":"array-utils-slicing.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-slicing.mts"],"names":[],"mappings":"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"}
|
|
@@ -34,9 +34,9 @@ import '../../number/enum/int8.mjs';
|
|
|
34
34
|
import '../../number/enum/uint8.mjs';
|
|
35
35
|
import '../../number/num.mjs';
|
|
36
36
|
import '../../number/refined-number-utils.mjs';
|
|
37
|
+
import { isEmpty } from './array-utils-length-bounded-array-guard.mjs';
|
|
37
38
|
import { size } from './array-utils-size.mjs';
|
|
38
39
|
import { sliceClamped } from './array-utils-slice-clamped.mjs';
|
|
39
|
-
import { isEmpty } from './array-utils-validation.mjs';
|
|
40
40
|
|
|
41
41
|
const tail = (array) => (
|
|
42
42
|
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils-slicing.mjs","sources":["../../../src/array/impl/array-utils-slicing.mts"],"sourcesContent":["import {\n type List,\n type NonEmptyArray,\n type NonEmptyTuple,\n type StructuralPrefixLength,\n} from 'ts-type-forge';\nimport { Uint32 } from '../../number/index.mjs';\nimport { type SizeType } from '../../types.mjs';\nimport { size } from './array-utils-size.mjs';\nimport { sliceClamped } from './array-utils-slice-clamped.mjs';\nimport { isEmpty } from './array-utils-validation.mjs';\n\n/**\n * Returns all elements of an array except the first one.\n *\n * @example\n *\n * ```ts\n * {\n * const scientists = ['Ada', 'Grace', 'Katherine'] as const;\n *\n * const remainder = Arr.tail(scientists);\n *\n * assert.deepStrictEqual(remainder, ['Grace', 'Katherine']);\n *\n * assert.isTrue(remainder.length === 2);\n * }\n *\n * {\n * const values = [1, 2, 3] as const;\n *\n * const remainder = Arr.rest(values);\n *\n * const emptyRemainder = Arr.rest([1] as const);\n *\n * assert.deepStrictEqual(remainder, [2, 3] as const);\n *\n * assert.deepStrictEqual(emptyRemainder, [] as const);\n * }\n * ```\n */\nexport const tail = <const Ar extends readonly unknown[]>(\n array: Ar,\n): List.Tail<Ar> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n array.slice(1) as unknown as List.Tail<Ar>;\n\n/**\n * Returns all elements of an array except the last one.\n *\n * @example\n *\n * ```ts\n * const queue = ['task-1', 'task-2', 'task-3'] as const;\n *\n * const withoutLast = Arr.butLast(queue);\n *\n * assert.deepStrictEqual(withoutLast, ['task-1', 'task-2']);\n *\n * assert.isTrue(withoutLast.length === 2);\n * ```\n */\nexport const butLast = <const Ar extends readonly unknown[]>(\n array: Ar,\n): List.ButLast<Ar> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n (isEmpty(array) ? [] : array.slice(0, -1)) as unknown as List.ButLast<Ar>;\n\n/**\n * Takes the first N elements from an array.\n *\n * @example\n *\n * ```ts\n * const values = [1, 2, 3, 4] as const;\n *\n * const firstTwo = Arr.take(values, 2);\n *\n * const firstThree = Arr.take(3)(values);\n *\n * assert.deepStrictEqual(firstTwo, [1, 2]);\n *\n * assert.deepStrictEqual(firstThree, [1, 2, 3]);\n * ```\n */\nexport function take<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): N extends StructuralPrefixLength\n ? List.Take<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function take<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => N extends StructuralPrefixLength\n ? List.Take<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function take<E>(\n ...args:\n | readonly [array: readonly E[], num: SizeType.ArgArr]\n | readonly [num: SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return takeImpl(...args);\n\n case 1:\n return (array) => takeImpl(array, ...args);\n }\n}\n\nconst takeImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] => sliceClamped(array, 0, num);\n\n/**\n * Takes the last N elements from an array.\n *\n * @example\n *\n * ```ts\n * const values = [1, 2, 3, 4] as const;\n *\n * const lastTwo = Arr.takeLast(values, 2);\n *\n * const lastThree = Arr.takeLast(3)(values);\n *\n * assert.deepStrictEqual(lastTwo, [3, 4]);\n *\n * assert.deepStrictEqual(lastThree, [2, 3, 4]);\n * ```\n */\nexport function takeLast<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): N extends StructuralPrefixLength\n ? List.TakeLast<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function takeLast<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => N extends StructuralPrefixLength\n ? List.TakeLast<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function takeLast<E>(\n ...args:\n | readonly [array: readonly E[], num: SizeType.ArgArr]\n | readonly [num: SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return takeLastImpl(...args);\n\n case 1:\n return (array) => takeLastImpl(array, ...args);\n }\n}\n\nconst takeLastImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] =>\n sliceClamped(array, Uint32.sub(size(array), num), size(array));\n\n/**\n * Skips the first N elements of an array.\n *\n * @example\n *\n * ```ts\n * const values = ['a', 'b', 'c', 'd'] as const;\n *\n * const withoutFirstTwo = Arr.skip(values, 2);\n *\n * const withoutFirstThree = Arr.skip(3)(values);\n *\n * assert.deepStrictEqual(withoutFirstTwo, ['c', 'd']);\n *\n * assert.deepStrictEqual(withoutFirstThree, ['d']);\n * ```\n */\nexport function skip<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): N extends StructuralPrefixLength ? List.Skip<N, Ar> : readonly Ar[number][];\n\n// curried version\nexport function skip<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => N extends StructuralPrefixLength\n ? List.Skip<N, Ar>\n : readonly Ar[number][];\n\nexport function skip<E>(\n ...args: readonly [readonly E[], SizeType.ArgArr] | readonly [SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return skipImpl(...args);\n\n case 1:\n return (array) => skipImpl(array, ...args);\n }\n}\n\nconst skipImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] => sliceClamped(array, num, size(array));\n\n/**\n * Skips the last N elements of an array.\n *\n * @example\n *\n * ```ts\n * const values = ['a', 'b', 'c', 'd'] as const;\n *\n * const withoutLastTwo = Arr.skipLast(values, 2);\n *\n * const withoutLastThree = Arr.skipLast(3)(values);\n *\n * assert.deepStrictEqual(withoutLastTwo, ['a', 'b']);\n *\n * assert.deepStrictEqual(withoutLastThree, ['a']);\n * ```\n */\nexport function skipLast<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): N extends StructuralPrefixLength\n ? List.SkipLast<N, Ar>\n : readonly Ar[number][];\n\n// curried version\nexport function skipLast<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => N extends StructuralPrefixLength\n ? List.SkipLast<N, Ar>\n : readonly Ar[number][];\n\nexport function skipLast<E>(\n ...args:\n | readonly [array: readonly E[], num: SizeType.ArgArr]\n | readonly [num: SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return skipLastImpl(...args);\n\n case 1:\n return (array) => skipLastImpl(array, ...args);\n }\n}\n\nconst skipLastImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] => sliceClamped(array, 0, Uint32.sub(size(array), num));\n\n/**\n * Alias for `tail`.\n *\n * @see {@link tail}\n */\nexport const rest = tail;\n\n/**\n * Alias for `skip`.\n *\n * @see {@link skip}\n */\nexport const drop = skip;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCO,MAAM,OAAO,CAClB,KAAA;AAAA;AAAA,EAGA,KAAA,CAAM,MAAM,CAAC;AAAA;AAiBR,MAAM,UAAU,CACrB,KAAA;AAAA;AAAA,EAGC,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE;AAAA;AA6CnC,SAAS,QACX,IAAA,EAGqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IAEzB,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAE/C;AAEA,MAAM,WAAW,CACf,KAAA,EACA,QACiB,YAAA,CAAa,KAAA,EAAO,GAAG,GAAG,CAAA;AA6CtC,SAAS,YACX,IAAA,EAGqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,YAAA,CAAa,GAAG,IAAI,CAAA;AAAA,IAE7B,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAEnD;AAEA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,GAAA,KAEA,aAAa,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAoCxD,SAAS,QACX,IAAA,EACqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IAEzB,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAE/C;AAEA,MAAM,QAAA,GAAW,CACf,KAAA,EACA,GAAA,KACiB,aAAa,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,KAAK,CAAC,CAAA;AAsChD,SAAS,YACX,IAAA,EAGqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,YAAA,CAAa,GAAG,IAAI,CAAA;AAAA,IAE7B,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAEnD;AAEA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,GAAA,KACiB,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAO/D,MAAM,IAAA,GAAO;AAOb,MAAM,IAAA,GAAO;;;;"}
|
|
1
|
+
{"version":3,"file":"array-utils-slicing.mjs","sources":["../../../src/array/impl/array-utils-slicing.mts"],"sourcesContent":["import {\n type ConstrainedList,\n type HasLengthConstraint,\n type List,\n type NonEmptyArray,\n type NonEmptyTuple,\n type StructuralPrefixLength,\n} from 'ts-type-forge';\nimport { Uint32 } from '../../number/index.mjs';\nimport { type SizeType } from '../../types.mjs';\nimport { isEmpty } from './array-utils-length-bounded-array-guard.mjs';\nimport { size } from './array-utils-size.mjs';\nimport { sliceClamped } from './array-utils-slice-clamped.mjs';\n\n/**\n * Returns all elements of an array except the first one.\n *\n * @example\n *\n * ```ts\n * {\n * const scientists = ['Ada', 'Grace', 'Katherine'] as const;\n *\n * const remainder = Arr.tail(scientists);\n *\n * assert.deepStrictEqual(remainder, ['Grace', 'Katherine']);\n *\n * assert.isTrue(remainder.length === 2);\n * }\n *\n * {\n * const values = [1, 2, 3] as const;\n *\n * const remainder = Arr.rest(values);\n *\n * const emptyRemainder = Arr.rest([1] as const);\n *\n * assert.deepStrictEqual(remainder, [2, 3] as const);\n *\n * assert.deepStrictEqual(emptyRemainder, [] as const);\n * }\n * ```\n */\nexport const tail = <const Ar extends readonly unknown[]>(\n array: Ar,\n): ConstrainedList.Tail<Ar> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n array.slice(1) as unknown as ConstrainedList.Tail<Ar>;\n\n/**\n * Returns all elements of an array except the last one.\n *\n * @example\n *\n * ```ts\n * const queue = ['task-1', 'task-2', 'task-3'] as const;\n *\n * const withoutLast = Arr.butLast(queue);\n *\n * assert.deepStrictEqual(withoutLast, ['task-1', 'task-2']);\n *\n * assert.isTrue(withoutLast.length === 2);\n * ```\n */\nexport const butLast = <const Ar extends readonly unknown[]>(\n array: Ar,\n): ConstrainedList.ButLast<Ar> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n (isEmpty(array)\n ? []\n : array.slice(0, -1)) as unknown as ConstrainedList.ButLast<Ar>;\n\n/**\n * Takes the first N elements from an array.\n *\n * @example\n *\n * ```ts\n * const values = [1, 2, 3, 4] as const;\n *\n * const firstTwo = Arr.take(values, 2);\n *\n * const firstThree = Arr.take(3)(values);\n *\n * assert.deepStrictEqual(firstTwo, [1, 2]);\n *\n * assert.deepStrictEqual(firstThree, [1, 2, 3]);\n * ```\n */\nexport function take<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.Take<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function take<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.Take<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function take<E>(\n ...args:\n | readonly [array: readonly E[], num: SizeType.ArgArr]\n | readonly [num: SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return takeImpl(...args);\n\n case 1:\n return (array) => takeImpl(array, ...args);\n }\n}\n\nconst takeImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] => sliceClamped(array, 0, num);\n\n/**\n * Takes the last N elements from an array.\n *\n * @example\n *\n * ```ts\n * const values = [1, 2, 3, 4] as const;\n *\n * const lastTwo = Arr.takeLast(values, 2);\n *\n * const lastThree = Arr.takeLast(3)(values);\n *\n * assert.deepStrictEqual(lastTwo, [3, 4]);\n *\n * assert.deepStrictEqual(lastThree, [2, 3, 4]);\n * ```\n */\nexport function takeLast<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.TakeLast<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function takeLast<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.TakeLast<N, Ar>\n : N extends SizeType.ArgArrPositive\n ? Ar extends NonEmptyTuple<unknown>\n ? NonEmptyArray<Ar[number]>\n : readonly Ar[number][]\n : readonly Ar[number][];\n\nexport function takeLast<E>(\n ...args:\n | readonly [array: readonly E[], num: SizeType.ArgArr]\n | readonly [num: SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return takeLastImpl(...args);\n\n case 1:\n return (array) => takeLastImpl(array, ...args);\n }\n}\n\nconst takeLastImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] =>\n sliceClamped(array, Uint32.sub(size(array), num), size(array));\n\n/**\n * Skips the first N elements of an array.\n *\n * @example\n *\n * ```ts\n * const values = ['a', 'b', 'c', 'd'] as const;\n *\n * const withoutFirstTwo = Arr.skip(values, 2);\n *\n * const withoutFirstThree = Arr.skip(3)(values);\n *\n * assert.deepStrictEqual(withoutFirstTwo, ['c', 'd']);\n *\n * assert.deepStrictEqual(withoutFirstThree, ['d']);\n * ```\n */\nexport function skip<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.Skip<N, Ar>\n : readonly Ar[number][];\n\n// curried version\nexport function skip<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.Skip<N, Ar>\n : readonly Ar[number][];\n\nexport function skip<E>(\n ...args: readonly [readonly E[], SizeType.ArgArr] | readonly [SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return skipImpl(...args);\n\n case 1:\n return (array) => skipImpl(array, ...args);\n }\n}\n\nconst skipImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] => sliceClamped(array, num, size(array));\n\n/**\n * Skips the last N elements of an array.\n *\n * @example\n *\n * ```ts\n * const values = ['a', 'b', 'c', 'd'] as const;\n *\n * const withoutLastTwo = Arr.skipLast(values, 2);\n *\n * const withoutLastThree = Arr.skipLast(3)(values);\n *\n * assert.deepStrictEqual(withoutLastTwo, ['a', 'b']);\n *\n * assert.deepStrictEqual(withoutLastThree, ['a']);\n * ```\n */\nexport function skipLast<\n const Ar extends readonly unknown[],\n N extends SizeType.ArgArr,\n>(\n array: Ar,\n num: N,\n): HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.SkipLast<N, Ar>\n : readonly Ar[number][];\n\n// curried version\nexport function skipLast<N extends SizeType.ArgArr>(\n num: N,\n): <const Ar extends readonly unknown[]>(\n array: Ar,\n) => HasLengthConstraint<Ar> extends true\n ? readonly Ar[number][]\n : N extends StructuralPrefixLength\n ? List.SkipLast<N, Ar>\n : readonly Ar[number][];\n\nexport function skipLast<E>(\n ...args:\n | readonly [array: readonly E[], num: SizeType.ArgArr]\n | readonly [num: SizeType.ArgArr]\n): readonly E[] | ((array: readonly E[]) => readonly E[]) {\n switch (args.length) {\n case 2:\n return skipLastImpl(...args);\n\n case 1:\n return (array) => skipLastImpl(array, ...args);\n }\n}\n\nconst skipLastImpl = <E,>(\n array: readonly E[],\n num: SizeType.ArgArr,\n): readonly E[] => sliceClamped(array, 0, Uint32.sub(size(array), num));\n\n/**\n * Alias for `tail`.\n *\n * @see {@link tail}\n */\nexport const rest = tail;\n\n/**\n * Alias for `skip`.\n *\n * @see {@link skip}\n */\nexport const drop = skip;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CO,MAAM,OAAO,CAClB,KAAA;AAAA;AAAA,EAGA,KAAA,CAAM,MAAM,CAAC;AAAA;AAiBR,MAAM,UAAU,CACrB,KAAA;AAAA;AAAA,EAGC,OAAA,CAAQ,KAAK,CAAA,GACV,KACA,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE;AAAA;AAiDhB,SAAS,QACX,IAAA,EAGqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IAEzB,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAE/C;AAEA,MAAM,WAAW,CACf,KAAA,EACA,QACiB,YAAA,CAAa,KAAA,EAAO,GAAG,GAAG,CAAA;AAiDtC,SAAS,YACX,IAAA,EAGqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,YAAA,CAAa,GAAG,IAAI,CAAA;AAAA,IAE7B,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAEnD;AAEA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,GAAA,KAEA,aAAa,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AA0CxD,SAAS,QACX,IAAA,EACqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IAEzB,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAE/C;AAEA,MAAM,QAAA,GAAW,CACf,KAAA,EACA,GAAA,KACiB,aAAa,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,KAAK,CAAC,CAAA;AA0ChD,SAAS,YACX,IAAA,EAGqD;AACxD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,YAAA,CAAa,GAAG,IAAI,CAAA;AAAA,IAE7B,KAAK,CAAA;AACH,MAAA,OAAO,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA;AAEnD;AAEA,MAAM,YAAA,GAAe,CACnB,KAAA,EACA,GAAA,KACiB,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAO/D,MAAM,IAAA,GAAO;AAOb,MAAM,IAAA,GAAO;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type FixedLengthTuple, type
|
|
1
|
+
import { type BoundedLengthArray, type ChangeArrayElement, type ConstrainedList, type FixedLengthTuple, type HasLengthConstraint, type IsFixedLengthList, type NonEmptyArray, type NonEmptyTuple, type PositiveInt, type Primitive, type SafeUintWithSmallInt, type SupportedLength, type UnknownBrand, type WithSmallInt } from 'ts-type-forge';
|
|
2
2
|
import { IMap } from '../../collections/index.mjs';
|
|
3
3
|
import { type ArrayIndex, type MapSetKeyType, type SizeType } from '../../types.mjs';
|
|
4
4
|
/**
|
|
@@ -20,12 +20,13 @@ import { type ArrayIndex, type MapSetKeyType, type SizeType } from '../../types.
|
|
|
20
20
|
* assert.deepStrictEqual(indexed, ['0:1', '1:2', '2:3']);
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
|
+
export declare function map<const Ar extends readonly unknown[] & UnknownBrand, B>(array: Ar, mapFn: (a: Ar[number], index: ArrayIndex<Ar>) => B): ChangeArrayElement<Ar, B>;
|
|
23
24
|
export declare function map<const Ar extends readonly unknown[], B>(array: Ar, mapFn: (a: Ar[number], index: ArrayIndex<Ar>) => B): Readonly<{
|
|
24
25
|
[K in keyof Ar]: B;
|
|
25
26
|
}>;
|
|
26
|
-
export declare function map<A, B>(mapFn: (a: A, index: SizeType.Arr) => B): <const Ar extends readonly A[]>(array: Ar) => Readonly<{
|
|
27
|
+
export declare function map<A, B>(mapFn: (a: A, index: SizeType.Arr) => B): (<const Ar extends readonly A[] & UnknownBrand>(array: Ar) => ChangeArrayElement<Ar, B>) & (<const Ar extends readonly A[]>(array: Ar) => Readonly<{
|
|
27
28
|
[K in keyof Ar]: B;
|
|
28
|
-
}
|
|
29
|
+
}>);
|
|
29
30
|
/**
|
|
30
31
|
* Returns an array of successively reduced values from an array.
|
|
31
32
|
*
|
|
@@ -74,7 +75,7 @@ export declare function scan<E, S>(reducer: (accumulator: S, currentValue: E, cu
|
|
|
74
75
|
* assert.deepStrictEqual(reversed, expected);
|
|
75
76
|
* ```
|
|
76
77
|
*/
|
|
77
|
-
export declare const toReversed: <const Ar extends readonly unknown[]>(array: Ar) =>
|
|
78
|
+
export declare const toReversed: <const Ar extends readonly unknown[]>(array: Ar) => ConstrainedList.Reverse<Ar>;
|
|
78
79
|
/**
|
|
79
80
|
* Sorts an array.
|
|
80
81
|
*
|
|
@@ -100,7 +101,7 @@ export declare const toReversed: <const Ar extends readonly unknown[]>(array: Ar
|
|
|
100
101
|
* assert.deepStrictEqual(alphabetical, expectedWords);
|
|
101
102
|
* ```
|
|
102
103
|
*/
|
|
103
|
-
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 ? FixedLengthTuple<Ar['length'], Ar[number]> : Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][];
|
|
104
|
+
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]) => HasLengthConstraint<Ar> extends true ? ChangeArrayElement<Ar, Ar[number]> : IsFixedLengthList<Ar> extends true ? FixedLengthTuple<Ar['length'], Ar[number]> : Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][];
|
|
104
105
|
/**
|
|
105
106
|
* Sorts an array by a mapped value.
|
|
106
107
|
*
|
|
@@ -141,8 +142,8 @@ export declare const toSorted: <const Ar extends readonly unknown[]>(...[array,
|
|
|
141
142
|
* );
|
|
142
143
|
* ```
|
|
143
144
|
*/
|
|
144
|
-
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 ? FixedLengthTuple<Ar['length'], Ar[number]> : Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][];
|
|
145
|
-
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 ? FixedLengthTuple<Ar['length'], Ar[number]> : Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][];
|
|
145
|
+
export declare function toSortedBy<const Ar extends readonly unknown[]>(array: Ar, comparatorValueMapper: (value: Ar[number]) => number, comparator?: (x: number, y: number) => number): HasLengthConstraint<Ar> extends true ? ChangeArrayElement<Ar, Ar[number]> : IsFixedLengthList<Ar> extends true ? FixedLengthTuple<Ar['length'], Ar[number]> : Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][];
|
|
146
|
+
export declare function toSortedBy<const Ar extends readonly unknown[], const V>(array: Ar, comparatorValueMapper: (value: Ar[number]) => V, comparator: (x: V, y: V) => number): HasLengthConstraint<Ar> extends true ? ChangeArrayElement<Ar, Ar[number]> : IsFixedLengthList<Ar> extends true ? FixedLengthTuple<Ar['length'], Ar[number]> : Ar extends NonEmptyTuple<unknown> ? NonEmptyArray<Ar[number]> : readonly Ar[number][];
|
|
146
147
|
/**
|
|
147
148
|
* Filters an array based on a predicate function.
|
|
148
149
|
*
|
|
@@ -282,26 +283,48 @@ export declare function flatMap<A, B>(mapFn: (a: A, index: SizeType.Arr) => read
|
|
|
282
283
|
*
|
|
283
284
|
* const triples = Arr.partition(3)(values);
|
|
284
285
|
*
|
|
286
|
+
* // Every chunk is branded `BoundedLengthArray<1, N, …>` — `partition` never
|
|
287
|
+
* // emits an empty chunk — so the expected values are annotated with the
|
|
288
|
+
* // unbranded type.
|
|
285
289
|
* const expectedPairs = [[1, 2], [3, 4], [5]] as const;
|
|
286
290
|
*
|
|
287
|
-
* assert.deepStrictEqual(
|
|
291
|
+
* assert.deepStrictEqual<readonly (readonly number[])[]>(
|
|
292
|
+
* pairs,
|
|
293
|
+
* expectedPairs,
|
|
294
|
+
* );
|
|
288
295
|
*
|
|
289
|
-
* assert.deepStrictEqual(triples, [
|
|
296
|
+
* assert.deepStrictEqual<readonly (readonly number[])[]>(triples, [
|
|
290
297
|
* [1, 2, 3],
|
|
291
298
|
* [4, 5],
|
|
292
299
|
* ]);
|
|
293
300
|
*
|
|
294
301
|
* const pairs2 = Arr.chunk([1, 2, 3, 4, 5, 6], 2);
|
|
295
302
|
*
|
|
296
|
-
* assert.deepStrictEqual(pairs2, [
|
|
303
|
+
* assert.deepStrictEqual<readonly (readonly number[])[]>(pairs2, [
|
|
297
304
|
* [1, 2],
|
|
298
305
|
* [3, 4],
|
|
299
306
|
* [5, 6],
|
|
300
307
|
* ]);
|
|
301
308
|
* ```
|
|
302
309
|
*/
|
|
303
|
-
export declare function partition<N extends WithSmallInt<PositiveInt & SizeType.Arr
|
|
304
|
-
export declare function partition<N extends WithSmallInt<PositiveInt & SizeType.Arr>>(chunkSize: N): <E>(array: readonly E[]) => readonly
|
|
310
|
+
export declare function partition<E, N extends WithSmallInt<PositiveInt & SizeType.Arr>>(array: readonly E[], chunkSize: N): readonly PartitionChunk<N, E>[];
|
|
311
|
+
export declare function partition<N extends WithSmallInt<PositiveInt & SizeType.Arr>>(chunkSize: N): <E>(array: readonly E[]) => readonly PartitionChunk<N, E>[];
|
|
312
|
+
/**
|
|
313
|
+
* Element type of {@link partition}'s result: a chunk holds between 1 and `N`
|
|
314
|
+
* elements. The lower bound is what makes this worth spelling out — `partition`
|
|
315
|
+
* never emits an empty chunk, so indexed access into a chunk is not
|
|
316
|
+
* `undefined` at position `0`, unlike with a plain `readonly E[]`.
|
|
317
|
+
*
|
|
318
|
+
* Falls back to {@link NonEmptyArray} when `N` is not a bound the brand can
|
|
319
|
+
* express, which keeps that lower bound in every case.
|
|
320
|
+
*/
|
|
321
|
+
type PartitionChunk<N, E> = N extends SupportedLength ? BoundedLengthArray<1, N, E> : NonEmptyArray<E>;
|
|
322
|
+
/**
|
|
323
|
+
* Alias for `partition`.
|
|
324
|
+
*
|
|
325
|
+
* @see {@link partition}
|
|
326
|
+
*/
|
|
327
|
+
export declare const chunk: typeof partition;
|
|
305
328
|
/**
|
|
306
329
|
* Concatenates two arrays.
|
|
307
330
|
*
|
|
@@ -400,13 +423,7 @@ export declare function groupBy<E, G extends MapSetKeyType>(grouper: (value: E,
|
|
|
400
423
|
* assert.deepStrictEqual(pairs, expectedPairs);
|
|
401
424
|
* ```
|
|
402
425
|
*/
|
|
403
|
-
export declare const zip: <const Ar1 extends readonly unknown[], const Ar2 extends readonly unknown[]>(array1: Ar1, array2: Ar2) =>
|
|
404
|
-
/**
|
|
405
|
-
* Alias for `partition`.
|
|
406
|
-
*
|
|
407
|
-
* @see {@link partition}
|
|
408
|
-
*/
|
|
409
|
-
export declare const chunk: typeof partition;
|
|
426
|
+
export declare const zip: <const Ar1 extends readonly unknown[], const Ar2 extends readonly unknown[]>(array1: Ar1, array2: Ar2) => ConstrainedList.Zip<Ar1, Ar2>;
|
|
410
427
|
/**
|
|
411
428
|
* Computes the cartesian product of arrays.
|
|
412
429
|
* cartesianProduct([[1,2], [3,4]]) => [[1,3], [1,4], [2,3], [2,4]]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-utils-transformation.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-transformation.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,
|
|
1
|
+
{"version":3,"file":"array-utils-transformation.d.mts","sourceRoot":"","sources":["../../../src/array/impl/array-utils-transformation.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,EAEhB,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAInD,OAAO,EACL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAC;AAKzB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC,EACvE,KAAK,EAAE,EAAE,EACT,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,GACjD,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAQ7B,wBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,EACxD,KAAK,EAAE,EAAE,EACT,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,GACjD,QAAQ,CAAC;KAAG,CAAC,IAAI,MAAM,EAAE,GAAG,CAAC;CAAE,CAAC,CAAC;AAapC,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EACtB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,GACtC,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,CAAC,EAAE,GAAG,YAAY,EAC/C,KAAK,EAAE,EAAE,KACN,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAC7B,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,CAAC,EAAE,EAC7B,KAAK,EAAE,EAAE,KACN,QAAQ,CAAC;KAAG,CAAC,IAAI,MAAM,EAAE,GAAG,CAAC;CAAE,CAAC,CAAC,CAAC;AAuBzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,EACzD,KAAK,EAAE,EAAE,EACT,OAAO,EAAE,CACP,WAAW,EAAE,CAAC,EACd,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,EACxB,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC,KACzB,CAAC,EACN,IAAI,EAAE,CAAC,GACN,aAAa,CAAC,CAAC,CAAC,CAAC;AAEpB,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EACvB,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,EAC3E,IAAI,EAAE,CAAC,GACN,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC;AAmD7C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,SACrD,EAAE,KACR,eAAe,CAAC,OAAO,CAAC,EAAE,CAEA,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,0BAClC,EAAE,SAAS,SAAS,MAAM,EAAE,GAChD,SAAS,CACP,KAAK,EAAE,EAAE,EAET,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,MAAM,CACtD,GACD,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,KAC7E,mBAAmB,CAAC,EAAE,CAAC,SAAS,IAAI,GACnC,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAClC,iBAAiB,CAAC,EAAE,CAAC,SAAS,IAAI,GAChC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAC1C,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,GAC/B,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GACzB,SAAS,EAAE,CAAC,MAAM,CAAC,EAOf,CAAC;AAEb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAC5D,KAAK,EAAE,EAAE,EACT,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,MAAM,EAEpD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,GAC5C,mBAAmB,CAAC,EAAE,CAAC,SAAS,IAAI,GACnC,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAClC,iBAAiB,CAAC,EAAE,CAAC,SAAS,IAAI,GAChC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAC1C,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,GAC/B,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GACzB,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAE9B,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,EACrE,KAAK,EAAE,EAAE,EACT,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GACjC,mBAAmB,CAAC,EAAE,CAAC,SAAS,IAAI,GACnC,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAClC,iBAAiB,CAAC,EAAE,CAAC,SAAS,IAAI,GAChC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAC1C,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,GAC/B,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GACzB,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAmB9B;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAAgB,MAAM,CACpB,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACnC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,EAEpB,KAAK,EAAE,EAAE,EACT,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAC1D,SAAS,CAAC,EAAE,CAAC;AAEhB,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EACnC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAC/C,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;AAGzC,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACxD,KAAK,EAAE,EAAE,EACT,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,OAAO,GAC3D,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAEzB,wBAAgB,MAAM,CAAC,CAAC,EACtB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,GAChD,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;AAwBzC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAC3D,KAAK,EAAE,EAAE,EACT,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,OAAO,GAC3D,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAEzB,wBAAgB,SAAS,CAAC,CAAC,EACzB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,OAAO,GAChD,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;AAwBzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,IAAI,GAAI,KAAK,CAAC,EAAE,SAAS,SAAS,SAAS,EAAE,SACjD,EAAE,KACR,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,GAChC,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GACzB,SAAS,EAAE,CAAC,MAAM,CAAC,EAEc,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,MAAM,GACjB,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACnC,CAAC,SAAS,SAAS,SAEZ,EAAE,SACF,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAC9B,EAAE,SAAS,aAAa,CAAC,OAAO,CAAC,GAChC,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GACzB,SAAS,EAAE,CAAC,MAAM,CAAC,EAatB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,IAAI,CAClB,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACnC,CAAC,SAAS,oBAAoB,GAAG,CAAC,EAClC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,SAAS,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAErD,wBAAgB,IAAI,CAAC,CAAC,SAAS,oBAAoB,GAAG,CAAC,EACrD,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACrC,KAAK,EAAE,EAAE,KACN,SAAS,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAqCjC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EAAE,CAAC,EAC5D,KAAK,EAAE,EAAE,EACT,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,EAAE,GAC5D,SAAS,CAAC,EAAE,CAAC;AAEhB,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,SAAS,CAAC,EAAE,GACjD,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;AAyBzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,SAAS,CACvB,CAAC,EACD,CAAC,SAAS,YAAY,CAAC,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,EAClD,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAEtE,wBAAgB,SAAS,CAAC,CAAC,SAAS,YAAY,CAAC,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,EAC1E,SAAS,EAAE,CAAC,GACX,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,SAAS,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAoB/D;;;;;;;;GAQG;AACH,KAAK,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,eAAe,GACjD,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC3B,aAAa,CAAC,CAAC,CAAC,CAAC;AAarB;;;;GAIG;AACH,eAAO,MAAM,KAAK,kBAAY,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,MAAM,GACjB,KAAK,CAAC,GAAG,SAAS,SAAS,OAAO,EAAE,EACpC,KAAK,CAAC,GAAG,SAAS,SAAS,OAAO,EAAE,UAE5B,GAAG,UACH,GAAG,KACV,YAAY,CAAC,GAAG,EAAE,GAAG,CAES,CAAC;AAElC;;;;;GAKG;AACH,KAAK,YAAY,CACf,GAAG,SAAS,SAAS,OAAO,EAAE,EAC9B,GAAG,SAAS,SAAS,OAAO,EAAE,IAE9B,GAAG,SAAS,aAAa,CAAC,OAAO,CAAC,GAC9B,SAAS,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GACpE,GAAG,SAAS,aAAa,CAAC,OAAO,CAAC,GAChC,SAAS,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GACpE,SAAS,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,OAAO,CACrB,KAAK,CAAC,EAAE,SAAS,SAAS,OAAO,EAAE,EACnC,CAAC,SAAS,aAAa,EAEvB,KAAK,EAAE,EAAE,EACT,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,GACvD,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElC,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,aAAa,EAChD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,GAC5C,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;AAwClD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,GAAG,GACd,KAAK,CAAC,GAAG,SAAS,SAAS,OAAO,EAAE,EACpC,KAAK,CAAC,GAAG,SAAS,SAAS,OAAO,EAAE,UAE5B,GAAG,UACH,GAAG,KACV,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAMgB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,UACxB,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAChC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAWzB,CAAC"}
|
|
@@ -42,8 +42,8 @@ import '../../number/enum/uint8.mjs';
|
|
|
42
42
|
import '../../number/num.mjs';
|
|
43
43
|
import '../../number/refined-number-utils.mjs';
|
|
44
44
|
import { seq, newArray } from './array-utils-creation.mjs';
|
|
45
|
+
import { isNonEmpty } from './array-utils-length-bounded-array-guard.mjs';
|
|
45
46
|
import { size } from './array-utils-size.mjs';
|
|
46
|
-
import { isNonEmpty } from './array-utils-validation.mjs';
|
|
47
47
|
|
|
48
48
|
function map(...args) {
|
|
49
49
|
switch (args.length) {
|
|
@@ -176,6 +176,7 @@ const partitionImpl = (array, chunkSize) => chunkSize < 2 ? [] : (
|
|
|
176
176
|
(i) => array.slice(chunkSize * i, chunkSize * (i + 1))
|
|
177
177
|
)
|
|
178
178
|
);
|
|
179
|
+
const chunk = partition;
|
|
179
180
|
const concat = (array1, array2) => (
|
|
180
181
|
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
181
182
|
[...array1, ...array2]
|
|
@@ -212,7 +213,6 @@ const zip = (array1, array2) => (
|
|
|
212
213
|
)
|
|
213
214
|
)
|
|
214
215
|
);
|
|
215
|
-
const chunk = partition;
|
|
216
216
|
const cartesianProduct = (arrays) => {
|
|
217
217
|
if (!isNonEmpty(arrays)) return [[]];
|
|
218
218
|
const [first, ...rest] = arrays;
|