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.

151 lines (149 loc) 4.13 kB
/** * Checks if two arrays are equal by comparing their elements. * * @example * * ```ts * const numbers = [1, 2, 3] as const; * * const sameNumbers = [1, 2, 3] as const; * * const differentNumbers = [1, 2, 4] as const; * * assert.isTrue(Arr.eq(numbers, sameNumbers)); * * assert.isFalse(Arr.eq(numbers, differentNumbers)); * ``` */ const eq = (array1, array2, equality = Object.is) => array1.length === array2.length && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion array1.every((v, i) => equality(v, array2[i])); /** * Alias for `eq`. * * @see {@link eq} */ const equal = eq; /** * Checks if the first array is a subset of the second array. * * @example * * ```ts * const subset = [1, 2] as const; * * const superset = [1, 2, 3] as const; * * const notSubset = [2, 4] as const; * * assert.isTrue(Arr.isSubset(subset, superset)); * * assert.isFalse(Arr.isSubset(notSubset, superset)); * ``` */ const isSubset = (array1, array2) => array1.every((a) => // eslint-disable-next-line total-functions/no-unsafe-type-assertion array2.includes(a)); /** * Checks if the first array is a superset of the second array. * * @example * * ```ts * const potentialSuperset = ['a', 'b', 'c'] as const; * * const subset = ['a', 'c'] as const; * * const notSuperset = ['a', 'd'] as const; * * assert.isTrue(Arr.isSuperset(potentialSuperset, subset)); * * assert.isFalse(Arr.isSuperset(subset, potentialSuperset)); * * assert.isFalse(Arr.isSuperset(potentialSuperset, notSuperset)); * ``` */ const isSuperset = (array1, array2) => isSubset(array2, array1); /** * Returns the intersection of two arrays. * * @example * * ```ts * const refs = ['Ada', 'Alan', 'Grace'] as const; * * const attendees = ['Grace', 'Alan', 'Barbara'] as const; * * const both = Arr.setIntersection(refs, attendees); * * assert.deepStrictEqual(both, ['Alan', 'Grace']); * ``` */ const setIntersection = (array1, array2) => // eslint-disable-next-line total-functions/no-unsafe-type-assertion array1.filter((e) => array2.includes(e)); /** * Returns the set difference of two arrays (elements in first but not in second). * * @example * * ```ts * const baseline = [1, 2, 3, 4] as const; * * const removed = [2, 4] as const; * * const remaining = Arr.setDifference(baseline, removed); * * assert.deepStrictEqual(remaining, [1, 3]); * ``` */ const setDifference = (array1, array2) => array1.filter((e) => !array2.includes(e)); /** * Returns the set difference of two sorted numeric arrays (optimized for sorted arrays). * * @example * * ```ts * const upcoming = [1, 3, 5, 7, 9] as const; * * const completed = [3, 4, 7] as const; * * const remaining = Arr.sortedNumSetDifference(upcoming, completed); * * const expected = [1, 5, 9] as const; * * assert.deepStrictEqual(remaining, expected); * ``` */ const sortedNumSetDifference = (sortedList1, sortedList2) => { const mut_result = []; let mut_it1 = 0; // iterator for sortedList1 let mut_it2 = 0; // iterator for sortedList2 while (mut_it1 < sortedList1.length && mut_it2 < sortedList2.length) { // Non-null assertions are safe due to loop condition // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const val1 = sortedList1[mut_it1]; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const val2 = sortedList2[mut_it2]; if (val1 === val2) { mut_it1 += 1; mut_it2 += 1; } else if (val1 < val2) { mut_result.push(val1); mut_it1 += 1; } else { // val1 > val2 mut_it2 += 1; } } // Add remaining elements from sortedList1 for (; mut_it1 < sortedList1.length; mut_it1 += 1) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion mut_result.push(sortedList1[mut_it1]); } return mut_result; }; export { eq, equal, isSubset, isSuperset, setDifference, setIntersection, sortedNumSetDifference }; //# sourceMappingURL=array-utils-set-op.mjs.map