moderndash 0.0.16 → 0.0.18

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.
Files changed (66) hide show
  1. package/README.md +16 -75
  2. package/dist/index.cjs +66 -73
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.ts +125 -113
  5. package/dist/index.js +62 -69
  6. package/dist/index.js.map +1 -1
  7. package/package.json +6 -5
  8. package/src/array/chunk.ts +0 -31
  9. package/src/array/difference.ts +0 -21
  10. package/src/array/differenceBy.ts +0 -30
  11. package/src/array/differenceWith.ts +0 -31
  12. package/src/array/dropRightWhile.ts +0 -28
  13. package/src/array/dropWhile.ts +0 -24
  14. package/src/array/index.ts +0 -21
  15. package/src/array/intersection.ts +0 -20
  16. package/src/array/intersectionBy.ts +0 -26
  17. package/src/array/intersectionWith.ts +0 -33
  18. package/src/array/sample.ts +0 -18
  19. package/src/array/sampleSize.ts +0 -31
  20. package/src/array/shuffle.ts +0 -33
  21. package/src/array/takeRightWhile.ts +0 -33
  22. package/src/array/takeWhile.ts +0 -33
  23. package/src/array/uniq.ts +0 -18
  24. package/src/array/uniqBy.ts +0 -25
  25. package/src/array/uniqWith.ts +0 -20
  26. package/src/array/unzip.ts +0 -20
  27. package/src/array/unzipWith.ts +0 -26
  28. package/src/array/zip.ts +0 -17
  29. package/src/array/zipWith.ts +0 -28
  30. package/src/collection/countBy.ts +0 -38
  31. package/src/collection/groupBy.ts +0 -32
  32. package/src/collection/index.ts +0 -3
  33. package/src/collection/sortBy.ts +0 -15
  34. package/src/function/after.ts +0 -29
  35. package/src/function/before.ts +0 -31
  36. package/src/function/debounce.ts +0 -125
  37. package/src/function/index.ts +0 -7
  38. package/src/function/memoize.ts +0 -63
  39. package/src/function/once.ts +0 -22
  40. package/src/function/throttle.ts +0 -13
  41. package/src/function/times.ts +0 -24
  42. package/src/helpers/collections.ts +0 -5
  43. package/src/helpers/shortHands.ts +0 -17
  44. package/src/helpers/stringModifiers.ts +0 -18
  45. package/src/helpers/typeofChecks.ts +0 -3
  46. package/src/index.ts +0 -7
  47. package/src/lang/index.ts +0 -4
  48. package/src/lang/isEmpty.ts +0 -51
  49. package/src/lang/isEqual.ts +0 -80
  50. package/src/lang/isEqualWith.ts +0 -34
  51. package/src/lang/isPlainObject.ts +0 -3
  52. package/src/object/index.ts +0 -1
  53. package/src/object/pick.ts +0 -21
  54. package/src/string/camelCase.ts +0 -30
  55. package/src/string/capitalize.ts +0 -14
  56. package/src/string/deburr.ts +0 -20
  57. package/src/string/escape.ts +0 -21
  58. package/src/string/escapeRegExp.ts +0 -15
  59. package/src/string/index.ts +0 -11
  60. package/src/string/kebabCase.ts +0 -25
  61. package/src/string/pascalCase.ts +0 -26
  62. package/src/string/snakeCase.ts +0 -30
  63. package/src/string/startCase.ts +0 -25
  64. package/src/string/stripSpecialChars.ts +0 -17
  65. package/src/string/unescape.ts +0 -22
  66. package/src/types.ts +0 -15
package/dist/index.js CHANGED
@@ -13,6 +13,20 @@ function chunk(chunkSize, array) {
13
13
  return chunkedArray;
14
14
  }
15
15
 
16
+ // src/array/count.ts
17
+ function count(array, iteratee) {
18
+ const result = {};
19
+ for (const value of array) {
20
+ const key = iteratee(value);
21
+ if (result[key] === void 0) {
22
+ result[key] = 1;
23
+ } else {
24
+ result[key] += 1;
25
+ }
26
+ }
27
+ return result;
28
+ }
29
+
16
30
  // src/array/differenceWith.ts
17
31
  function differenceWith(comparator, ...arrays) {
18
32
  const difference2 = [];
@@ -100,7 +114,7 @@ function differenceBy(iteratee, ...arrays) {
100
114
  }
101
115
 
102
116
  // src/array/dropRightWhile.ts
103
- function dropRightWhile(predicate, array) {
117
+ function dropRightWhile(array, predicate) {
104
118
  let i = array.length;
105
119
  while (i > 0 && predicate(array[i - 1])) {
106
120
  i--;
@@ -109,11 +123,22 @@ function dropRightWhile(predicate, array) {
109
123
  }
110
124
 
111
125
  // src/array/dropWhile.ts
112
- function dropWhile(predicate, array) {
126
+ function dropWhile(array, predicate) {
113
127
  const index = array.findIndex((x) => !predicate(x));
114
128
  return array.slice(index === -1 ? array.length : index);
115
129
  }
116
130
 
131
+ // src/array/group.ts
132
+ function group(array, iteratee) {
133
+ const result = {};
134
+ for (const value of array) {
135
+ const key = iteratee(value);
136
+ result[key] = result[key] ?? [];
137
+ result[key].push(value);
138
+ }
139
+ return result;
140
+ }
141
+
117
142
  // src/array/intersectionWith.ts
118
143
  function intersectionWith(comparator, ...arrays) {
119
144
  const intersection2 = [];
@@ -147,7 +172,7 @@ function sample(array) {
147
172
  }
148
173
 
149
174
  // src/array/sampleSize.ts
150
- function sampleSize(size, array) {
175
+ function sampleSize(array, size) {
151
176
  const sampleArray = [];
152
177
  if (array.length === 0 || size <= 0) {
153
178
  return sampleArray;
@@ -174,6 +199,21 @@ function shuffle(array) {
174
199
  return shuffledArray;
175
200
  }
176
201
 
202
+ // src/array/sort.ts
203
+ function sort(array, order, iteratee) {
204
+ return [...array].sort((a, b) => {
205
+ const aValue = iteratee ? iteratee(a) : a;
206
+ const bValue = iteratee ? iteratee(b) : b;
207
+ if (aValue < bValue) {
208
+ return order === "desc" ? 1 : -1;
209
+ }
210
+ if (aValue > bValue) {
211
+ return order === "desc" ? -1 : 1;
212
+ }
213
+ return 0;
214
+ });
215
+ }
216
+
177
217
  // src/array/takeRightWhile.ts
178
218
  function takeRightWhile(predicate, array) {
179
219
  const result = [];
@@ -188,7 +228,7 @@ function takeRightWhile(predicate, array) {
188
228
  }
189
229
 
190
230
  // src/array/takeWhile.ts
191
- function takeWhile(predicate, array) {
231
+ function takeWhile(array, predicate) {
192
232
  const result = [];
193
233
  for (const element of array) {
194
234
  if (predicate(element)) {
@@ -201,7 +241,7 @@ function takeWhile(predicate, array) {
201
241
  }
202
242
 
203
243
  // src/array/uniqWith.ts
204
- function uniqWith(comparator, array) {
244
+ function uniqWith(array, comparator) {
205
245
  return array.filter((value, index, self) => {
206
246
  return self.findIndex((otherValue) => comparator(value, otherValue)) === index;
207
247
  });
@@ -209,17 +249,17 @@ function uniqWith(comparator, array) {
209
249
 
210
250
  // src/array/uniq.ts
211
251
  function uniq(array) {
212
- return uniqWith(isEqual, array);
252
+ return uniqWith(array, isEqual);
213
253
  }
214
254
 
215
255
  // src/array/uniqBy.ts
216
- function uniqBy(iteratee, array) {
256
+ function uniqBy(array, iteratee) {
217
257
  const iterateeFunction = getIterateFunction(iteratee);
218
- return uniqWith((a, b) => iterateeFunction(a) === iterateeFunction(b), array);
258
+ return uniqWith(array, (a, b) => iterateeFunction(a) === iterateeFunction(b));
219
259
  }
220
260
 
221
261
  // src/array/unzipWith.ts
222
- function unzipWith(iteratee, array) {
262
+ function unzipWith(array, iteratee) {
223
263
  const result = [];
224
264
  for (const elements of array) {
225
265
  result.push(iteratee(...elements));
@@ -229,7 +269,7 @@ function unzipWith(iteratee, array) {
229
269
 
230
270
  // src/array/unzip.ts
231
271
  function unzip(array) {
232
- return unzipWith((...t) => t, array);
272
+ return unzipWith(array, (...t) => t);
233
273
  }
234
274
 
235
275
  // src/array/zipWith.ts
@@ -247,71 +287,24 @@ function zip(...arrays) {
247
287
  return zipWith((...t) => t, ...arrays);
248
288
  }
249
289
 
250
- // src/helpers/collections.ts
251
- function getValuesFromCollection(collection) {
252
- return Array.isArray(collection) ? collection : Object.values(collection);
253
- }
254
-
255
- // src/collection/countBy.ts
256
- function countBy(collection, iteratee) {
257
- const result = {};
258
- const values = getValuesFromCollection(collection);
259
- for (const value of values) {
260
- const key = iteratee(value);
261
- if (result[key] === void 0) {
262
- result[key] = 1;
263
- } else {
264
- result[key] += 1;
265
- }
266
- }
267
- return result;
268
- }
269
-
270
- // src/collection/groupBy.ts
271
- function groupBy(collection, iteratee) {
272
- const result = {};
273
- const values = getValuesFromCollection(collection);
274
- for (const value of values) {
275
- const key = iteratee(value);
276
- result[key] = result[key] ?? [];
277
- result[key].push(value);
278
- }
279
- return result;
280
- }
281
-
282
- // src/collection/sortBy.ts
283
- function sortBy(iteratee, array) {
284
- return array.sort((a, b) => {
285
- const aValue = iteratee(a);
286
- const bValue = iteratee(b);
287
- if (aValue < bValue) {
288
- return -1;
289
- }
290
- if (aValue > bValue) {
291
- return 1;
292
- }
293
- return 0;
294
- });
295
- }
296
-
297
290
  // src/function/after.ts
298
291
  function after(n, func) {
299
- let count = 1;
292
+ let count2 = 1;
300
293
  return (...args) => {
301
- if (count >= n) {
294
+ if (count2 >= n) {
302
295
  return func(...args);
303
296
  }
304
- count += 1;
297
+ count2 += 1;
305
298
  };
306
299
  }
307
300
 
308
301
  // src/function/before.ts
309
302
  function before(n, func) {
310
- let count = 0;
303
+ let count2 = 0;
311
304
  let result;
312
305
  return (...args) => {
313
- if (count < n) {
314
- count += 1;
306
+ if (count2 < n) {
307
+ count2 += 1;
315
308
  result = func(...args);
316
309
  }
317
310
  return result;
@@ -569,8 +562,8 @@ function startCase(str) {
569
562
  return startCase2.trimEnd();
570
563
  }
571
564
 
572
- // src/string/stripSpecialChars.ts
573
- function stripSpecialChars(str) {
565
+ // src/string/stripSpecial.ts
566
+ function stripSpecial(str) {
574
567
  str = deburr(str);
575
568
  return str.replace(/[^\s\w]/gi, "");
576
569
  }
@@ -592,7 +585,7 @@ export {
592
585
  camelCase,
593
586
  capitalize,
594
587
  chunk,
595
- countBy,
588
+ count,
596
589
  debounce,
597
590
  deburr,
598
591
  difference,
@@ -602,7 +595,7 @@ export {
602
595
  dropWhile,
603
596
  escape,
604
597
  escapeRegExp,
605
- groupBy,
598
+ group,
606
599
  intersection,
607
600
  intersectionBy,
608
601
  intersectionWith,
@@ -619,9 +612,9 @@ export {
619
612
  sampleSize,
620
613
  shuffle,
621
614
  snakeCase,
622
- sortBy,
615
+ sort,
623
616
  startCase,
624
- stripSpecialChars,
617
+ stripSpecial,
625
618
  takeRightWhile,
626
619
  takeWhile,
627
620
  throttle,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/array/chunk.ts","../src/array/differenceWith.ts","../src/lang/isEqual.ts","../src/array/difference.ts","../src/helpers/typeofChecks.ts","../src/helpers/shortHands.ts","../src/lang/isEqualWith.ts","../src/array/differenceBy.ts","../src/array/dropRightWhile.ts","../src/array/dropWhile.ts","../src/array/intersectionWith.ts","../src/array/intersection.ts","../src/array/intersectionBy.ts","../src/array/sample.ts","../src/array/sampleSize.ts","../src/array/shuffle.ts","../src/array/takeRightWhile.ts","../src/array/takeWhile.ts","../src/array/uniqWith.ts","../src/array/uniq.ts","../src/array/uniqBy.ts","../src/array/unzipWith.ts","../src/array/unzip.ts","../src/array/zipWith.ts","../src/array/zip.ts","../src/helpers/collections.ts","../src/collection/countBy.ts","../src/collection/groupBy.ts","../src/collection/sortBy.ts","../src/function/after.ts","../src/function/before.ts","../src/function/debounce.ts","../src/function/memoize.ts","../src/function/once.ts","../src/function/throttle.ts","../src/function/times.ts","../src/lang/isEmpty.ts","../src/lang/isPlainObject.ts","../src/object/pick.ts","../src/string/deburr.ts","../src/helpers/stringModifiers.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/escape.ts","../src/string/escapeRegExp.ts","../src/string/kebabCase.ts","../src/string/pascalCase.ts","../src/string/snakeCase.ts","../src/string/startCase.ts","../src/string/stripSpecialChars.ts","../src/string/unescape.ts"],"sourcesContent":["/**\n * Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.\n *\n * @category Array\n * @returns Returns the new array of chunks.\n * @param chunkSize - The array to process.\n * @param array - The length of each chunk\n * @example\n * chunk(2, ['a', 'b', 'c', 'd'])\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(3, ['a', 'b', 'c', 'd'])\n * // => [['a', 'b', 'c'], ['d']]\n */\n\nexport function chunk<TInput>(chunkSize: number, array: TInput[]): TInput[][] {\n const sizeInteger = Math.trunc(chunkSize);\n if (array.length === 0 || sizeInteger < 1) {\n return [];\n }\n\n const chunkedArray = [];\n let i = 0;\n\n while (i < array.length) {\n chunkedArray.push(array.slice(i, i + sizeInteger));\n i += sizeInteger;\n }\n\n return chunkedArray;\n}\n","import type { MinimumTwoArrays } from '../types';\n\n/**\n * This method is like `difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `pullAllWith`, this method returns a new array.\n *\n * @category Array\n * @param comparator - The comparator invoked per element.\n * @param arrays - First array to inspect. Others are excluded.\n * @returns Returns the new array of filtered values.\n * @example\n * differenceWith(isEqual, [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }], [{ 'x': 1, 'y': 2 }])\n * // => [{ 'x': 2, 'y': 1 }]\n */\n\nexport function differenceWith<T>(comparator: (a: T, b: T) => boolean, ...arrays: MinimumTwoArrays<T>): T[] {\n const difference: T[] = [];\n const [firstArray, ...restArrays] = arrays;\n\n firstArray.forEach(element => {\n if (!restArrays.some(array => array.some(item => comparator(item, element)))) {\n difference.push(element);\n }\n });\n\n return difference;\n}\n","import type { RecordKey } from '../types';\n\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @category Lang\n * @param value1 - The value to compare.\n * @param value2 - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n * @example\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n\nexport function isEqual(value1: unknown, value2: unknown): boolean {\n if (value1 === value2) return true;\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return isSameArray(value1, value2);\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString();\n }\n\n if (isObject(value1) && isObject(value2)) {\n return isSameObject(value1, value2);\n }\n\n return false;\n}\n\ntype KeyValueObject = Record<RecordKey, unknown>;\nfunction isObject(value: unknown): value is KeyValueObject {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction isSameObject(value1: KeyValueObject, value2: KeyValueObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\n if (!isEqual(keys1, keys2)) return false;\n\n // check if the values of each key in the objects are equal\n for (const key of keys1) {\n if (!isEqual(value1[key], value2[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(value1: unknown[], value2: unknown[]) {\n // check if the arrays have the same length\n if (value1.length !== value2.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of value1.entries()) {\n if (!isEqual(element, value2[i])) return false;\n }\n\n return true;\n}\n","import type { MinimumTwoArrays } from '../types';\n\nimport { differenceWith } from '@array/differenceWith';\nimport { isEqual } from '@lang/isEqual';\n\n/**\n * Creates an array of `array` values not included in the other given arrays. The order and references of result values are determined by the first array.\n *\n * **Note:** Unlike `pullAll`, this method returns a new array.\n *\n * @category Array\n * @param arrays - First array is inspected, others are excluded.\n * @returns Returns the new array of filtered values.\n * @example\n * difference([2, 1], [2, 3])\n * // => [1]\n */\n\nexport function difference<TInput>(...arrays: MinimumTwoArrays<TInput>): TInput[] {\n return differenceWith(isEqual, ...arrays);\n}\n","export function isObjectKey(key: unknown): key is keyof object {\n return typeof key === 'string' || typeof key === 'number' || typeof key === 'symbol';\n}\n","import type { IterateeFunction, PropertyShorthand } from '../types';\n\nimport { isObjectKey } from '@helpers/typeofChecks';\n\nexport function getPropertyShorthand<T, K extends keyof T>(key: K): (object: T) => T[K] {\n return object => object[key];\n}\n\nexport function getIterateFunction<T>(iteratee: IterateeFunction<T> | PropertyShorthand<T>) {\n if (typeof iteratee === 'function') {\n return iteratee;\n } else if (isObjectKey(iteratee)) {\n return getPropertyShorthand(iteratee);\n } else {\n throw new TypeError('Expected iteratee to be a function or a property name');\n }\n}\n","import { isEqual } from '@lang/isEqual';\n\n/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @category Lang\n * @param value1 - The value to compare.\n * @param value2 - The other value to compare.\n * @param customizer - The function to customize comparisons.\n * @returns Returns `true` if the values are equivalent, else `false`.\n * @example\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * isEqualWith(array, other, customizer);\n * // => true\n*/\n\nexport function isEqualWith<T>(a: T, b: T, customizer: (value: T) => unknown): boolean {\n return isEqual(customizer(a), customizer(b));\n}\n","import type { IterateeFunction, MinimumTwoArrays, PropertyShorthand } from '../types';\n\nimport { differenceWith } from '@array/differenceWith';\nimport { getIterateFunction } from '@helpers/shortHands';\nimport { isEqualWith } from '@lang/isEqualWith';\n\n/**\n * This method is like `difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `pullAllBy`, this method returns a new array.\n *\n * @category Array\n * @param iteratee - The iteratee invoked per element. Or property shorthand.\n * @param arrays - First array to inspect. Others are excluded.\n\n * @returns Returns the new array of filtered values.\n * @example\n * differenceBy(Math.floor, [2.1, 1.2], [2.3, 3.4])\n * // => [1.2]\n * differenceBy('x', [{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }])\n * // => [{ 'x': 2 }]\n */\n\nexport function differenceBy<T>(iteratee: IterateeFunction<T> | PropertyShorthand<T>, ...arrays: MinimumTwoArrays<T>): T[] {\n const iterateeFunction = getIterateFunction(iteratee);\n return differenceWith((a, b) => isEqualWith(a, b, iterateeFunction), ...arrays);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * dropRightWhile(({ active }) => active, users)\n * // => objects for ['barney']\n */\n\n\nexport function dropRightWhile<T>(predicate: (value: T) => boolean, array: T[]) {\n let i = array.length;\n while (i > 0 && predicate(array[i - 1])) {\n i--;\n }\n return array.slice(0, i);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * dropWhile(({ active }) => active, users)\n * // => objects for ['pebbles']\n */\n\nexport function dropWhile<T>(predicate: (value: T) => boolean, array: T[]): T[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","import type { MinimumTwoArrays } from '../types';\n\n/**\n * This method is like `intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @example\n * const objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n * const others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]\n *\n * intersectionWith(isEqual, objects, others)\n * // => [{ 'x': 1, 'y': 2 }]\n * @category Array\n * @param comparator - The comparator invoked per element.\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersectionWith<T>(comparator: (a: T, b: T) => boolean, ...arrays: MinimumTwoArrays<T>): T[] {\n const intersection: T[] = [];\n\n const [firstArray, ...restArrays] = arrays;\n\n firstArray.forEach(element => {\n if (restArrays.every(array => array.some(item => comparator(item, element)))) {\n intersection.push(element);\n }\n });\n\n return intersection;\n}\n","import type { MinimumTwoArrays } from '../types';\n\nimport { intersectionWith } from '@array/intersectionWith';\nimport { isEqual } from '@lang/isEqual';\n\n/**\n * Creates an array of unique values that are included in all given arrays.\n * The order and references of result values are determined by the first array.\n *\n * @category Array\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n */\n\nexport function intersection<TInput>(...arrays: MinimumTwoArrays<TInput>): TInput[] {\n return intersectionWith(isEqual, ...arrays);\n}\n","import type { IterateeFunction, MinimumTwoArrays, PropertyShorthand } from '../types';\n\nimport { intersectionWith } from '@array/intersectionWith';\nimport { getIterateFunction } from '@helpers/shortHands';\nimport { isEqualWith } from '@lang/isEqualWith';\n\n/**\n * This method is like `intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @example\n * intersectionBy(Math.floor, [2.1, 1.2], [2.3, 3.4])\n * // => [2.1]\n * @category Array\n * @param iteratee - The iteratee invoked per element. Or property shorthand.\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersectionBy<TInput>(iteratee: IterateeFunction<TInput> | PropertyShorthand<TInput>, ...arrays: MinimumTwoArrays<TInput>): TInput[] {\n const iterateeFunction = getIterateFunction(iteratee);\n return intersectionWith((a, b) => isEqualWith(a, b, iterateeFunction), ...arrays);\n}\n","/**\n * Gets a random element from `array`.\n *\n * @category Array\n * @param array - The array to sample.\n * @returns Returns the random element.\n * @example\n * sample([1, 2, 3, 4])\n * // => 2\n */\n\nexport function sample<T>(array: T[]): T | undefined {\n if (array.length === 0) {\n return undefined;\n }\n const randomIndex = Math.floor(Math.random() * array.length);\n return array[randomIndex];\n}\n","import { sample } from '@array/sample';\n\n/**\n * Gets `n` random elements at unique keys from `array` up to the\n * size of `array`.\n *\n * @category Array\n * @param size The number of elements to sample.\n * @param array The array to sample.\n * @returns Returns the random elements.\n * @example\n * sampleSize([1, 2, 3], 2)\n * // => [3, 1]\n *\n * sampleSize([1, 2, 3], 4)\n * // => [2, 3, 1]\n */\n\nexport function sampleSize<TInput>(size: number, array: TInput[]): TInput[] {\n const sampleArray: TInput[] = [];\n\n if (array.length === 0 || size <= 0) {\n return sampleArray;\n }\n\n for (let i = 0; i < size; i++) {\n sampleArray.push(sample(array) as TInput);\n }\n\n return sampleArray;\n}\n","/**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @since 0.1.0\n * @category Array\n * @param array - The array or object to shuffle.\n * @returns Returns the new shuffled array.\n * @example\n * shuffle([1, 2, 3, 4])\n * // => [4, 1, 3, 2]\n */\n\nexport function shuffle<TInput>(array: TInput[]): TInput[] {\n const shuffledArray = [...array];\n let currentIndex = shuffledArray.length;\n let temporaryValue: TInput;\n let randomIndex: number;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n // And swap it with the current element.\n temporaryValue = shuffledArray[currentIndex];\n shuffledArray[currentIndex] = shuffledArray[randomIndex];\n shuffledArray[randomIndex] = temporaryValue;\n }\n\n return shuffledArray;\n}\n","/**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * takeRightWhile(({ active }) => active, users)\n * // => objects for ['fred', 'pebbles']\n */\n\nexport function takeRightWhile<T>(predicate: (elem: T) => boolean, array: T[]): T[] {\n const result: T[] = [];\n\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n result.unshift(array[i]);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * takeWhile(({ active }) => active, users)\n * // => objects for ['barney', 'fred']\n */\n\nexport function takeWhile<T>(predicate: (elem: T) => boolean, array: T[]): T[] {\n const result: T[] = [];\n\n for (const element of array) {\n if (predicate(element)) {\n result.push(element);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * This method is like `uniq` except that it accepts `comparator` which is invoked to compare elements of `array`.\n * The order of result values is determined by the order they occur in the array.\n *\n * @category Array\n * @param array - The array to inspect.\n * @param comparator - The comparator invoked per element.\n * @returns Returns the new duplicate free array.\n * @example\n * const objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]\n *\n * uniqWith(isEqual, objects)\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n\nexport function uniqWith<TInput>(comparator: (a: TInput, b: TInput) => boolean, array: TInput[]): TInput[] {\n return array.filter((value, index, self) => {\n return self.findIndex(otherValue => comparator(value, otherValue)) === index;\n });\n}\n","import { uniqWith } from '@array/uniqWith';\nimport { isEqual } from '@lang/isEqual';\n\n/**\n * Creates a duplicate-free version of an array, in which only the first occurrence of each element is kept.\n * The order of result values is determined by the order they occur in the array.\n *\n * @category Array\n * @param array - The array to inspect.\n * @returns Returns the new duplicate free array.\n * @example\n * uniq([2, 1, 2])\n * // => [2, 1]\n */\n\nexport function uniq<TInput>(array: TInput[]): TInput[] {\n return uniqWith(isEqual, array);\n}\n","import type { IterateeFunction, PropertyShorthand } from '../types';\n\nimport { uniqWith } from '@array/uniqWith';\nimport { getIterateFunction } from '@helpers/shortHands';\n\n/**\n * This method is like `uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array.\n *\n * @category Array\n * @param array - The array to inspect.\n * @param iteratee - The iteratee invoked per element. Or property shorthand.\n * @returns Returns the new duplicate free array.\n * @example\n * uniqBy(Math.floor, [2.1, 1.2, 2.3])\n * // => [2.1, 1.2]\n */\n\nexport function uniqBy<T>(iteratee: IterateeFunction<T> | PropertyShorthand<T>, array: T[]): T[] {\n const iterateeFunction = getIterateFunction(iteratee);\n\n return uniqWith((a, b) => iterateeFunction(a) === iterateeFunction(b), array);\n}\n","/**\n * This method is like `unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @category Array\n * @param iteratee - The function to combine regrouped values.\n * @param array - The array of grouped elements to process.\n * @returns Returns the new array of regrouped elements.\n * @example\n * const zipped = zip([1, 2], [10, 20], [100, 200])\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * unzipWith(add, zipped)\n * // => [3, 30, 300]\n */\n\nexport function unzipWith<TInput extends unknown[], TOutput>(iteratee: (...t: TInput) => TOutput, array: TInput[]): TOutput[] {\n const result: TOutput[] = [];\n\n for (const elements of array) {\n result.push(iteratee(...elements));\n }\n\n return result;\n}\n","import { unzipWith } from '@array/unzipWith';\n\n/**\n * This method is like `zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip configuration.\n *\n * @category Array\n * @param array - The array of grouped elements to process.\n * @returns Returns the new array of regrouped elements.\n * @example\n * const zipped = zip(['a', 'b'], [1, 2], [true, false])\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * unzip(zipped)\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n\nexport function unzip<TInput extends unknown[]>(array: TInput[]): TInput[] {\n return unzipWith((...t) => t, array);\n}\n","// Types from https://gist.github.com/briancavalier/c4af1538ae9b2e4ab97caf14306625ab\ntype UnZip<A extends readonly unknown[]> = {\n [K in keyof A]: readonly A[K][]\n};\n\n/**\n * This method is like `zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @category Array\n * @param combineFunc - The function to combine grouped values.\n * @param arrays - The arrays to process.\n * @returns Returns the new array of grouped elements.\n * @example\n * zipWith([1, 2], [10, 20], [100, 200], (a, b, c) => a + b + c)\n * // => [111, 222]\n */\n\nexport function zipWith<Args extends unknown[], TOutput>(combineFunc: (...args: Args) => TOutput, ...arrays: UnZip<Args>): TOutput[] {\n const len = Math.min(...arrays.map(a => a.length));\n const zipped: TOutput[] = [];\n for (let i = 0; i < len; i++) {\n // Typescript needs the Args hint, or it infers any[]\n zipped[i] = combineFunc(...arrays.map(a => a[i]) as Args);\n }\n return zipped;\n}\n","import { zipWith } from '@array/zipWith';\n\n/**\n * Creates an array of grouped elements, the first of which contains the first elements of the given arrays,\n * the second of which contains the second elements of the given arrays, and so on.\n *\n * @category Array\n * @param arrays - The arrays to process.\n * @returns Returns the new array of grouped elements.\n * @example\n * zip(['a', 'b'], [1, 2], [true, false])\n * // => [['a', 1, true], ['b', 2, false]]\n */\n\nexport function zip<TInput>(...arrays: TInput[][]): TInput[][] {\n return zipWith((...t) => t, ...arrays);\n}\n","import type { ArrayOrRecord } from '../types';\n\nexport function getValuesFromCollection<T>(collection: ArrayOrRecord<T>): T[] {\n return Array.isArray(collection) ? collection : Object.values(collection);\n}\n","import type { ArrayOrRecord, RecordKey } from '../types';\n\nimport { getValuesFromCollection } from '@helpers/collections';\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'betty', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ]\n *\n * countBy(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * @category Collection\n * @param iteratee - The iteratee to transform keys.\n * @param collection - The array or record to iterate over.\n * @returns Returns the composed aggregate object.\n */\n\nexport function countBy<TInput, TKey extends RecordKey>(collection: ArrayOrRecord<TInput>, iteratee: (value: TInput) => TKey): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n const values = getValuesFromCollection(collection);\n for (const value of values) {\n const key = iteratee(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result[key] === undefined) {\n result[key] = 1;\n } else {\n result[key] += 1;\n }\n }\n return result;\n}\n","import type { RecordKey, ArrayOrRecord } from '../types';\n\nimport { getValuesFromCollection } from '@helpers/collections';\n\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key.\n *\n * @example\n * groupBy([6.1, 4.2, 6.3], Math.floor)\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n * @category Collection\n * @param collection - The array or object to iterate over.\n * @param iteratee - The iteratee to transform keys.\n * @returns Returns the composed aggregate object.\n */\n\nexport function groupBy<T, U extends RecordKey>(collection: ArrayOrRecord<T>, iteratee: (value: T) => U): Record<U, T[]> {\n const result = {} as Record<U, T[]>;\n const values = getValuesFromCollection(collection);\n for (const value of values) {\n const key = iteratee(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n result[key] = result[key] ?? [];\n result[key].push(value);\n }\n return result;\n}\n","import type { NoUnion } from '../types';\n\nexport function sortBy<T, U>(iteratee: (item: T) => NoUnion<number | bigint | Date | string, U>, array: T[]): T[] {\n return array.sort((a, b) => {\n const aValue = iteratee(a);\n const bValue = iteratee(b);\n if (aValue < bValue) {\n return -1;\n }\n if (aValue > bValue) {\n return 1;\n }\n return 0;\n });\n}\n","import type { GenericFunction } from '../types.js';\n\n/**\n * The opposite of `before`. This method creates a function that invokes `func` once it's called `n` or more times.\n *\n * @category Function\n * @param n The number of calls before `func` is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n * @example\n * const caution = () => console.log(\"Caution!\");\n *\n * const afterFN = after(2, caution);\n *\n * afterFN()\n * afterFN()\n * afterFN()\n * // => `caution` is invoked after called twice\n */\n\nexport function after<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc) {\n let count = 1;\n return (...args: Parameters<TFunc>): ReturnType<TFunc> | undefined => {\n if (count >= n) {\n return func(...args);\n }\n count += 1;\n };\n}\n","/**\n * Creates a function that invokes `func`, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @category Function\n * @param n - The number of calls at which `func` is no longer invoked.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n * @example\n * const caution = () => console.log(\"Caution!\");\n *\n * // Only call caution two times\n * const reducedCaution = before(2, caution)\n *\n * reducedCaution()\n * reducedCaution()\n * reducedCaution()\n * // => `caution` is invoked twice\n */\n\nexport function before<TFunc extends (...args: Parameters<TFunc>) => ReturnType<TFunc>>(n: number, func: TFunc): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return ((...args: Parameters<TFunc>): ReturnType<TFunc> => {\n if (count < n) {\n count += 1;\n result = func(...args);\n }\n return result;\n }) as TFunc;\n}\n","import type { GenericFunction } from 'src/types.js';\n\n// TODO this is a port from lodash, it probably can be improved and shortened, also fix TS errors\nexport function debounce<TFunc extends GenericFunction<TFunc>>(\n fn: TFunc, wait = 0, options: { leading?: boolean, maxWait?: number, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n let lastArgs: Parameters<TFunc> | undefined;\n let lastThis: ThisParameterType<TFunc> | undefined;\n let result: ReturnType<TFunc>;\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n const maxing = options.maxWait ?? false;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n const maxWait = options.maxWait ?? 0;\n\n function invokeFunc(time: number) {\n const args: Parameters<TFunc> | undefined = lastArgs;\n const thisArg: ThisParameterType<TFunc> | undefined = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // @ts-expect-error\n result = fn.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n // @ts-expect-error\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined)\n return true;\n\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait);\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `fn` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n // TODO Fix this assignment\n // eslint-disable-next-line @typescript-eslint/no-this-alias,unicorn/no-this-assignment\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n","import type{ GenericFunction } from 'src/types.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, all arguments\n * provided to the memoized function are used as the map cache key.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @category Function\n * @param func - The function to have its output memoized.\n * @param resolver - The function to resolve the cache key.\n * @typeParam TFunc - The input function type\n * @typeParam Cache - The cache map type\n * @returns Returns the new memoized function.\n * @example\n * const object = \\{ 'a': 1, 'b': 2 \\}\n *\n * const values = memoize(values)\n * values(object)\n * // => [1, 2]\n *\n * values(object)\n * // => [1, 2]\n *\n * object.a = 2\n * values(object)\n * // => [2, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b'])\n * values(object)\n * // => ['a', 'b']\n *\n * // Replace `memoize.Cache`.\n * memoize.Cache = WeakMap\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string | symbol, ReturnType<TFunc>>>(\n func: TFunc, resolver: ((...args: Parameters<TFunc>) => string | symbol) = defaultResolver\n): TFunc & { cache: Cache } {\n\n const cache = new Map() as Cache;\n const memoizedFunc = (...args: Parameters<TFunc>): ReturnType<TFunc> => {\n const key = resolver(...args);\n if (cache.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return cache.get(key) as ReturnType<TFunc>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n}\n","import type { GenericFunction } from 'src/types.js';\n\nimport { before } from '@function/before';\n\n/**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @category Function\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n * @example\n * const initialize = once(() => console.log('initialize'))\n * initialize()\n * initialize()\n * // => `createApplication` is invoked once\n */\n\nexport function once<TFunc extends GenericFunction<TFunc>>(func: TFunc): TFunc {\n return before(1, func);\n}\n","import type { GenericFunction } from 'src/types.js';\n\nimport { debounce } from '@function/debounce';\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(\n func: TFunc, wait = 0, options: { leading?: boolean, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n return debounce(func, wait, {\n leading: options.leading ?? true,\n maxWait: wait,\n trailing: options.trailing ?? true\n });\n}\n","/**\n * Invokes the iteratee `n` times, returning an array of the results of\n * each invocation. The function is invoked with one argument: (index).\n *\n * @example\n * times(3, index => console.log(\"Run\", index)))\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(3, Math.random)\n * // => [0.123, 0.456, 0.789]\n * times(4, () => 0)\n * // => [0, 0, 0, 0]\n * @category Function\n * @param n - The number of times to invoke `func`.\n * @param iteratee - The function invoked per iteration.\n * @returns Returns the array of results.\n */\n\nexport function times<T>(n: number, func: (index: number) => T): T[] {\n const result: T[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @category Lang\n * @param value - The value to check.\n * @returns Returns `true` if `value` is empty, else `false`.\n * @example\n * isEmpty(null)\n * // => true\n *\n * isEmpty({})\n * // => true\n *\n * isEmpty(\"\")\n * // => true\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n */\n\nexport function isEmpty(value: string | object | null | undefined): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value).length === 0;\n }\n\n return false;\n}\n","export function isPlainObject(value: unknown): value is object {\n return value !== null && typeof value === 'object' && value.constructor === Object;\n}\n","/**\n * Creates an object composed of the picked `object` properties.\n *\n * @example\n * const object = { 'a': 1, 'b': '2', 'c': 3 }\n *\n * pick(object, ['a', 'c'])\n * // => { 'a': 1, 'c': 3 }\n * @category Object\n * @param object - The source object.\n * @param keys - The property paths to pick.\n * @returns Returns the new object.\n */\n\nexport function pick<T, K extends keyof T>(object: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n result[key] = object[key];\n }\n return result;\n}\n","/**\n * Deburrs a string by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @example\n * deburr('déjà vu')\n * // => 'deja vu'\n * @category String\n * @param str - The string to deburr.\n * @returns Returns the deburred string.\n */\n\nexport function deburr(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[^\\u0000-\\u007E]/g, (chr: string) =>\n chr.normalize('NFD').replace(/[\\u0300-\\u036F]/g, ''));\n}\n","import { deburr } from '@string/deburr';\n\nexport function splitWords(str: string): string[] {\n str = deburr(str);\n\n // Split non-alphanumeric characters with spaces and deal with camel/PascalCase\n const regex = new RegExp(\n '[^\\\\dA-Za-z]' + // match any character that is not a letter or a digit\n '|' + // or\n '(?<=[a-z])' + // lookbehind for a lowercase letter\n '(?=[A-Z])' + // lookahead for an uppercase letter\n '|' + // or\n '(?<=[A-Z])' + // lookbehind for an uppercase letter\n '(?=[A-Z][a-z])' // lookahead for an uppercase letter followed by a lowercase letter\n );\n\n return str.split(regex).filter(Boolean);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts `string` to camelCase.\n *\n * @example\n * camelCase('Foo Bar')\n * // => 'fooBar'\n * camelCase('--foo-bar--')\n * // => 'fooBar'\n * camelCase('__FOO_BAR__')\n * // => 'fooBar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the camel cased string.\n */\n\nexport function camelCase(str: string): string {\n const words = splitWords(str);\n\n // Capitalize the first letter of each word\n const camelCase = words.map((word, index) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return camelCase.join('');\n}\n","/**\n * Converts the first character of a string to upper case and the remaining to lower case.\n *\n * @example\n * capitalize('FRED')\n * // => 'Fred'\n * @category String\n * @param str - The string to capitalize.\n * @returns Returns the capitalized string.\n */\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Converts the characters `&`, `<`, `>`, `\"` and `'` in a string to their corresponding HTML entities.\n *\n * @example\n * escape('fred, barney, & pebbles')\n * // => 'fred, barney, &amp; pebbles'\n * @category String\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escape(str: string): string {\n const escapeChars: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\\'': '&#39;',\n '\"': '&quot;'\n };\n return str.replace(/[\"&'<>]/g, char => escapeChars[char] || char);\n}\n","/**\n * Escapes the `RegExp` special characters `^`, `$`, `\\`, `.`, `*`, `+`,\n * `?`, `(`, `)`, `[`, `]`, `{`, `}`, and `|` in a string.\n *\n * @example\n * escapeRegExp('[moderndash](https://moderndash.io/)')\n * // => '\\[moderndash\\]\\(https://moderndash\\.io/\\)'\n * @category String\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeRegExp(str: string): string {\n return str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * kebabCase('Foo Bar')\n * // => 'foo-bar'\n * kebabCase('fooBar')\n * // => 'foo-bar'\n * kebabCase('__FOO_BAR__')\n * // => 'foo-bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the kebab cased string.\n */\n\nexport function kebabCase(str: string): string {\n const words = splitWords(str);\n let kebabCase = '';\n for (const word of words) {\n kebabCase += word.toLowerCase() + '-';\n }\n return kebabCase.slice(0, -1);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n\n/**\n * Converts a string to PascalCase.\n *\n * @example\n * kebabCase('Foo Bar')\n * // => 'FooBar'\n * kebabCase('fooBar')\n * // => 'FooBar'\n * kebabCase('__FOO_BAR__')\n * // => 'FooBar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the pascal cased string.\n */\n\nexport function pascalCase(str: string): string {\n const words = splitWords(str);\n let pascalCase = '';\n for (const word of words) {\n pascalCase += word.charAt(0).toUpperCase() + word.slice(1);\n }\n return pascalCase;\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to snake_case.\n *\n * @example\n * snakeCase('Foo Bar')\n * // => 'foo_bar'\n * snakeCase('fooBar')\n * // => 'foo_bar'\n * snakeCase('--FOO-BAR--')\n * // => 'foo_bar'\n * snakeCase('foo2bar')\n * // => 'foo_2_bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the snake cased string.\n */\n\nexport function snakeCase(str: string): string {\n const words = splitWords(str);\n let snakeCase = '';\n for (const word of words) {\n if (snakeCase.length > 0) {\n snakeCase += '_';\n }\n snakeCase += word.toLowerCase();\n }\n return snakeCase;\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Start Case.\n *\n * @example\n * startCase('--foo-bar--')\n * // => 'Foo Bar'\n * startCase('fooBar')\n * // => 'Foo Bar'\n * startCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the start cased string.\n */\n\nexport function startCase(str: string): string {\n const words = splitWords(str);\n let startCase = '';\n for (const word of words) {\n startCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return startCase.trimEnd();\n}\n","import { deburr } from '@string/deburr';\n\n/**\n * Removes all special characters from a string.\n *\n * @example\n * stripSpecialChars('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @category String\n * @param str - The string to remove special characters from.\n * @returns Returns the string with special characters removed.\n*/\n\nexport function stripSpecialChars(str: string): string {\n str = deburr(str);\n return str.replace(/[^\\s\\w]/gi, '');\n}\n","/**\n * Converts the HTML entities `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;`\n * in a string to their corresponding characters.\n *\n * @example\n * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n * @category String\n * @param str - The string to unescape.\n * @returns Returns the unescaped string.\n */\n\nexport function unescape(str: string): string {\n const entityMap: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\''\n };\n return str.replace(/&(?:amp|lt|gt|quot|#(0+)?39);/g, (entity: string) => entityMap[entity] || entity);\n}\n"],"mappings":"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","names":["difference","intersection","camelCase","kebabCase","pascalCase","snakeCase","startCase"]}
1
+ {"version":3,"sources":["../src/array/chunk.ts","../src/array/count.ts","../src/array/differenceWith.ts","../src/lang/isEqual.ts","../src/array/difference.ts","../src/helpers/typeofChecks.ts","../src/helpers/shortHands.ts","../src/lang/isEqualWith.ts","../src/array/differenceBy.ts","../src/array/dropRightWhile.ts","../src/array/dropWhile.ts","../src/array/group.ts","../src/array/intersectionWith.ts","../src/array/intersection.ts","../src/array/intersectionBy.ts","../src/array/sample.ts","../src/array/sampleSize.ts","../src/array/shuffle.ts","../src/array/sort.ts","../src/array/takeRightWhile.ts","../src/array/takeWhile.ts","../src/array/uniqWith.ts","../src/array/uniq.ts","../src/array/uniqBy.ts","../src/array/unzipWith.ts","../src/array/unzip.ts","../src/array/zipWith.ts","../src/array/zip.ts","../src/function/after.ts","../src/function/before.ts","../src/function/debounce.ts","../src/function/memoize.ts","../src/function/once.ts","../src/function/throttle.ts","../src/function/times.ts","../src/lang/isEmpty.ts","../src/lang/isPlainObject.ts","../src/object/pick.ts","../src/string/deburr.ts","../src/helpers/stringModifiers.ts","../src/string/camelCase.ts","../src/string/capitalize.ts","../src/string/escape.ts","../src/string/escapeRegExp.ts","../src/string/kebabCase.ts","../src/string/pascalCase.ts","../src/string/snakeCase.ts","../src/string/startCase.ts","../src/string/stripSpecial.ts","../src/string/unescape.ts"],"sourcesContent":["/**\n * Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.\n *\n * @category Array\n * @returns Returns the new array of chunks.\n * @param chunkSize - The array to process.\n * @param array - The length of each chunk\n * @example\n * chunk(2, ['a', 'b', 'c', 'd'])\n * // => [['a', 'b'], ['c', 'd']]\n *\n * chunk(3, ['a', 'b', 'c', 'd'])\n * // => [['a', 'b', 'c'], ['d']]\n */\n\nexport function chunk<TInput>(chunkSize: number, array: TInput[]): TInput[][] {\n const sizeInteger = Math.trunc(chunkSize);\n if (array.length === 0 || sizeInteger < 1) {\n return [];\n }\n\n const chunkedArray = [];\n let i = 0;\n\n while (i < array.length) {\n chunkedArray.push(array.slice(i, i + sizeInteger));\n i += sizeInteger;\n }\n\n return chunkedArray;\n}\n","import type { RecordKey } from '../types';\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`.\n *\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'betty', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ]\n *\n * count(users, value => value.active);\n * // => { 'true': 2, 'false': 1 }\n * @category Array\n * @param iteratee - The iteratee to transform keys.\n * @param collection - The array or record to iterate over.\n * @returns Returns the composed aggregate object.\n */\n\nexport function count<TInput, TKey extends RecordKey>(array: TInput[], iteratee: (value: TInput) => TKey): Record<TKey, number> {\n const result = {} as Record<TKey, number>;\n for (const value of array) {\n const key = iteratee(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (result[key] === undefined) {\n result[key] = 1;\n } else {\n result[key] += 1;\n }\n }\n return result;\n}\n","import type { MinimumTwoArrays } from '../types';\n\n/**\n * This method is like `difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`.\n * The order and references of result values are determined by the first array.\n * The comparator is invoked with two arguments: (arrVal, othVal).\n *\n * @example\n * differenceWith(isEqual, [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }], [{ 'x': 1, 'y': 2 }])\n * // => [{ 'x': 2, 'y': 1 }]\n * @category Array\n * @param comparator - The comparator invoked per element.\n * @param arrays - First array to inspect. Others are excluded.\n * @returns Returns the new array of filtered values.\n */\n\nexport function differenceWith<T>(comparator: (a: T, b: T) => boolean, ...arrays: MinimumTwoArrays<T>): T[] {\n const difference: T[] = [];\n const [firstArray, ...restArrays] = arrays;\n\n firstArray.forEach(element => {\n if (!restArrays.some(array => array.some(item => comparator(item, element)))) {\n difference.push(element);\n }\n });\n\n return difference;\n}\n","import type { RecordKey } from '../types';\n\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @category Lang\n * @param value1 - The value to compare.\n * @param value2 - The other value to compare.\n * @returns Returns `true` if the values are equivalent, else `false`.\n * @example\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n\nexport function isEqual(value1: unknown, value2: unknown): boolean {\n if (value1 === value2) return true;\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n return isSameArray(value1, value2);\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString();\n }\n\n if (isObject(value1) && isObject(value2)) {\n return isSameObject(value1, value2);\n }\n\n return false;\n}\n\ntype KeyValueObject = Record<RecordKey, unknown>;\nfunction isObject(value: unknown): value is KeyValueObject {\n return typeof value === 'object'\n && value !== null\n && !Array.isArray(value)\n && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction isSameObject(value1: KeyValueObject, value2: KeyValueObject) {\n // check if the objects have the same keys\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\n if (!isEqual(keys1, keys2)) return false;\n\n // check if the values of each key in the objects are equal\n for (const key of keys1) {\n if (!isEqual(value1[key], value2[key])) return false;\n }\n\n // the objects are deeply equal\n return true;\n}\n\nfunction isSameArray(value1: unknown[], value2: unknown[]) {\n if (value1.length !== value2.length) return false;\n\n // check if the values of each element in the arrays are equal\n for (const [i, element] of value1.entries()) {\n if (!isEqual(element, value2[i])) return false;\n }\n\n return true;\n}\n","import type { MinimumTwoArrays } from '../types';\n\nimport { differenceWith } from '@array/differenceWith';\nimport { isEqual } from '@lang/isEqual';\n\n/**\n * Creates an array of `array` values not included in the other given arrays. The order and references of result values are determined by the first array.\n *\n * **Note:** Unlike `pullAll`, this method returns a new array.\n *\n * @category Array\n * @param arrays - First array is inspected, others are excluded.\n * @returns Returns the new array of filtered values.\n * @example\n * difference([2, 1], [2, 3])\n * // => [1]\n */\n\nexport function difference<TInput>(...arrays: MinimumTwoArrays<TInput>): TInput[] {\n return differenceWith(isEqual, ...arrays);\n}\n","export function isObjectKey(key: unknown): key is keyof object {\n return typeof key === 'string' || typeof key === 'number' || typeof key === 'symbol';\n}\n","import type { IterateeFunction, PropertyShorthand } from '../types';\n\nimport { isObjectKey } from '@helpers/typeofChecks';\n\nexport function getPropertyShorthand<T, K extends keyof T>(key: K): (object: T) => T[K] {\n return object => object[key];\n}\n\nexport function getIterateFunction<T>(iteratee: IterateeFunction<T> | PropertyShorthand<T>) {\n if (typeof iteratee === 'function') {\n return iteratee;\n } else if (isObjectKey(iteratee)) {\n return getPropertyShorthand(iteratee);\n } else {\n throw new TypeError('Expected iteratee to be a function or a property name');\n }\n}\n","import { isEqual } from '@lang/isEqual';\n\n/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @category Lang\n * @example\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * isEqualWith(array, other, customizer);\n * // => true\n * @param a - The value to compare.\n * @param b - The other value to compare.\n * @param customizer - The function to customize comparisons.\n * @returns Returns `true` if the values are equivalent, else `false`.\n*/\n\nexport function isEqualWith<T>(a: T, b: T, customizer: (value: T) => unknown): boolean {\n return isEqual(customizer(a), customizer(b));\n}\n","import type { IterateeFunction, MinimumTwoArrays, PropertyShorthand } from '../types';\n\nimport { differenceWith } from '@array/differenceWith';\nimport { getIterateFunction } from '@helpers/shortHands';\nimport { isEqualWith } from '@lang/isEqualWith';\n\n/**\n * This method is like `difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `pullAllBy`, this method returns a new array.\n *\n * @category Array\n * @param iteratee - The iteratee invoked per element. Or property shorthand.\n * @param arrays - First array to inspect. Others are excluded.\n\n * @returns Returns the new array of filtered values.\n * @example\n * differenceBy(Math.floor, [2.1, 1.2], [2.3, 3.4])\n * // => [1.2]\n * differenceBy('x', [{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }])\n * // => [{ 'x': 2 }]\n */\n\nexport function differenceBy<T>(iteratee: IterateeFunction<T> | PropertyShorthand<T>, ...arrays: MinimumTwoArrays<T>): T[] {\n const iterateeFunction = getIterateFunction(iteratee);\n return differenceWith((a, b) => isEqualWith(a, b, iterateeFunction), ...arrays);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * dropRightWhile(({ active }) => active, users)\n * // => objects for ['barney']\n */\n\n\nexport function dropRightWhile<T>(array: T[], predicate: (value: T) => boolean) {\n let i = array.length;\n while (i > 0 && predicate(array[i - 1])) {\n i--;\n }\n return array.slice(0, i);\n}\n","/**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * dropWhile(({ active }) => active, users)\n * // => objects for ['pebbles']\n */\n\nexport function dropWhile<T>(array: T[], predicate: (value: T) => boolean): T[] {\n const index = array.findIndex(x => !predicate(x));\n return array.slice(index === -1 ? array.length : index);\n}\n","import type { RecordKey } from '../types';\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key.\n *\n * @example\n * group([6.1, 4.2, 6.3], Math.floor)\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * group([6.1, 4.2, 6.3], value => value > 5)\n * // => { 'false': [4.2], 'true': [6.1, 6.3] }\n * @category Array\n * @param collection - The array or object to iterate over.\n * @param iteratee - The iteratee to transform keys.\n * @returns Returns the composed aggregate object.\n */\n\nexport function group<T, U extends RecordKey>(array: T[], iteratee: (value: T) => U): Record<U, T[]> {\n const result = {} as Record<U, T[]>;\n for (const value of array) {\n const key = iteratee(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n result[key] = result[key] ?? [];\n result[key].push(value);\n }\n return result;\n}\n","import type { MinimumTwoArrays } from '../types';\n\n/**\n * This method is like `intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @example\n * const objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n * const others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]\n *\n * intersectionWith(isEqual, objects, others)\n * // => [{ 'x': 1, 'y': 2 }]\n * @category Array\n * @param comparator - The comparator invoked per element.\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersectionWith<T>(comparator: (a: T, b: T) => boolean, ...arrays: MinimumTwoArrays<T>): T[] {\n const intersection: T[] = [];\n\n const [firstArray, ...restArrays] = arrays;\n\n firstArray.forEach(element => {\n if (restArrays.every(array => array.some(item => comparator(item, element)))) {\n intersection.push(element);\n }\n });\n\n return intersection;\n}\n","import type { MinimumTwoArrays } from '../types';\n\nimport { intersectionWith } from '@array/intersectionWith';\nimport { isEqual } from '@lang/isEqual';\n\n/**\n * Creates an array of unique values that are included in all given arrays.\n * The order and references of result values are determined by the first array.\n *\n * @category Array\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n * @example\n * intersection([2, 1], [2, 3])\n * // => [2]\n */\n\nexport function intersection<TInput>(...arrays: MinimumTwoArrays<TInput>): TInput[] {\n return intersectionWith(isEqual, ...arrays);\n}\n","import type { IterateeFunction, MinimumTwoArrays, PropertyShorthand } from '../types';\n\nimport { intersectionWith } from '@array/intersectionWith';\nimport { getIterateFunction } from '@helpers/shortHands';\nimport { isEqualWith } from '@lang/isEqualWith';\n\n/**\n * This method is like `intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @example\n * intersectionBy(Math.floor, [2.1, 1.2], [2.3, 3.4])\n * // => [2.1]\n * @category Array\n * @param iteratee - The iteratee invoked per element. Or property shorthand.\n * @param arrays - The arrays to inspect.\n * @returns Returns the new array of intersecting values.\n */\n\nexport function intersectionBy<TInput>(iteratee: IterateeFunction<TInput> | PropertyShorthand<TInput>, ...arrays: MinimumTwoArrays<TInput>): TInput[] {\n const iterateeFunction = getIterateFunction(iteratee);\n return intersectionWith((a, b) => isEqualWith(a, b, iterateeFunction), ...arrays);\n}\n","/**\n * Gets a random element from `array`.\n *\n * @example\n * sample([1, 2, 3, 4])\n * // => 2\n * @category Array\n * @param array - The array to sample.\n * @returns Returns the random element.\n */\n\nexport function sample<TInput>(array: TInput[]): TInput | undefined {\n if (array.length === 0) {\n return undefined;\n }\n const randomIndex = Math.floor(Math.random() * array.length);\n return array[randomIndex];\n}\n","import { sample } from '@array/sample';\n\n/**\n * Gets `n` random elements at unique keys from `array` up to the\n * size of `array`.\n *\n * @category Array\n * @param size The number of elements to sample.\n * @param array The array to sample.\n * @returns Returns the random elements.\n * @example\n * sampleSize([1, 2, 3], 2)\n * // => [3, 1]\n *\n * sampleSize([1, 2, 3], 4)\n * // => [2, 3, 1]\n */\n\nexport function sampleSize<TInput>(array: TInput[], size: number): TInput[] {\n const sampleArray: TInput[] = [];\n\n if (array.length === 0 || size <= 0) {\n return sampleArray;\n }\n\n for (let i = 0; i < size; i++) {\n sampleArray.push(sample(array) as TInput);\n }\n\n return sampleArray;\n}\n","/**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @example\n * shuffle([1, 2, 3, 4])\n * // => [4, 1, 3, 2]\n * @category Array\n * @param array - The array or object to shuffle.\n * @returns Returns the new shuffled array.\n */\n\nexport function shuffle<TInput>(array: TInput[]): TInput[] {\n const shuffledArray = [...array];\n let currentIndex = shuffledArray.length;\n let temporaryValue: TInput;\n let randomIndex: number;\n\n // While there remain elements to shuffle...\n while (0 !== currentIndex) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n // And swap it with the current element.\n temporaryValue = shuffledArray[currentIndex];\n shuffledArray[currentIndex] = shuffledArray[randomIndex];\n shuffledArray[randomIndex] = temporaryValue;\n }\n\n return shuffledArray;\n}\n","\n/**\n * Sorts the array in ascending or descending order.\n * An iteratee function is optional to sort the array based on a specific property.\n *\n * @example\n * sort([1, 2, 3, 4], 'desc')\n * // => [4, 3, 2, 1]\n *\n * sort([{ a: 1 }, { a: 2 }, { a: 3 }], 'asc', item => item.a)\n * // => [{ a: 1 }, { a: 2 }, { a: 3 }]\n * @category Array\n * @param array - The array to sort.\n * @param order - The order in which to sort the array.\n * @param iteratee - The iteratee function to sort the array based on a specific property.\n * @returns Returns the sorted array.\n */\n\nexport function sort<TInput>(array: TInput[], order?: 'asc' | 'desc', iteratee?: (item: TInput) => number | bigint | Date | string): TInput[] {\n return [...array].sort((a, b) => {\n const aValue = iteratee ? iteratee(a) : a;\n const bValue = iteratee ? iteratee(b) : b;\n if (aValue < bValue) {\n return order === 'desc' ? 1 : -1;\n }\n if (aValue > bValue) {\n return order === 'desc' ? -1 : 1;\n }\n return 0;\n });\n}\n","/**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate - The function invoked per iteration.\n * @param array - The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': true }\n * ]\n *\n * takeRightWhile(({ active }) => active, users)\n * // => objects for ['fred', 'pebbles']\n */\n\nexport function takeRightWhile<T>(predicate: (elem: T) => boolean, array: T[]): T[] {\n const result: T[] = [];\n\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n result.unshift(array[i]);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @category Array\n * @param predicate The function invoked per iteration.\n * @param array The array to query.\n * @returns Returns the slice of `array`.\n * @example\n * const users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': true },\n * { 'user': 'pebbles', 'active': false }\n * ]\n *\n * takeWhile(({ active }) => active, users)\n * // => objects for ['barney', 'fred']\n */\n\nexport function takeWhile<T>(array: T[], predicate: (elem: T) => boolean): T[] {\n const result: T[] = [];\n\n for (const element of array) {\n if (predicate(element)) {\n result.push(element);\n } else {\n break;\n }\n }\n\n return result;\n}\n","/**\n * This method is like `uniq` except that it accepts `comparator` which is invoked to compare elements of `array`.\n * The order of result values is determined by the order they occur in the array.\n *\n * @category Array\n * @param array - The array to inspect.\n * @param comparator - The comparator invoked per element.\n * @returns Returns the new duplicate free array.\n * @example\n * const objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]\n *\n * uniqWith(isEqual, objects)\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n\nexport function uniqWith<TInput>(array: TInput[], comparator: (a: TInput, b: TInput) => boolean): TInput[] {\n return array.filter((value, index, self) => {\n return self.findIndex(otherValue => comparator(value, otherValue)) === index;\n });\n}\n","import { uniqWith } from '@array/uniqWith';\nimport { isEqual } from '@lang/isEqual';\n\n/**\n * Creates a duplicate-free version of an array, in which only the first occurrence of each element is kept.\n * The order of result values is determined by the order they occur in the array.\n *\n * @category Array\n * @param array - The array to inspect.\n * @returns Returns the new duplicate free array.\n * @example\n * uniq([2, 1, 2])\n * // => [2, 1]\n */\n\nexport function uniq<TInput>(array: TInput[]): TInput[] {\n return uniqWith(array, isEqual);\n}\n","import type { IterateeFunction, PropertyShorthand } from '../types';\n\nimport { uniqWith } from '@array/uniqWith';\nimport { getIterateFunction } from '@helpers/shortHands';\n\n/**\n * This method is like `uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array.\n *\n * @category Array\n * @param array - The array to inspect.\n * @param iteratee - The iteratee invoked per element. Or property shorthand.\n * @returns Returns the new duplicate free array.\n * @example\n * uniqBy(Math.floor, [2.1, 1.2, 2.3])\n * // => [2.1, 1.2]\n */\n\nexport function uniqBy<T>( array: T[], iteratee: IterateeFunction<T> | PropertyShorthand<T>): T[] {\n const iterateeFunction = getIterateFunction(iteratee);\n\n return uniqWith(array, (a, b) => iterateeFunction(a) === iterateeFunction(b));\n}\n","/**\n * This method is like `unzip` except that it accepts `iteratee` to specify how regrouped values should be combined.\n *\n * @example\n * const zipped = zip([1, 2], [10, 20], [100, 200])\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * unzipWith(add, zipped)\n * // => [3, 30, 300]\n * @category Array\n * @param iteratee - The function to combine regrouped values.\n * @param array - The array of grouped elements to process.\n * @returns Returns the new array of regrouped elements.\n */\n\nexport function unzipWith<TInput extends unknown[], TOutput>(array: TInput[], iteratee: (...t: TInput) => TOutput): TOutput[] {\n const result: TOutput[] = [];\n\n for (const elements of array) {\n result.push(iteratee(...elements));\n }\n\n return result;\n}\n","import { unzipWith } from '@array/unzipWith';\n\n/**\n * This method is like `zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip configuration.\n *\n * @example\n * const zipped = zip(['a', 'b'], [1, 2], [true, false])\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * unzip(zipped)\n * // => [['a', 'b'], [1, 2], [true, false]]\n * @category Array\n * @param array - The array of grouped elements to process.\n * @returns Returns the new array of regrouped elements.\n */\n\nexport function unzip<TInput extends unknown[]>(array: TInput[]): TInput[] {\n return unzipWith(array, (...t) => t);\n}\n","// Types from https://gist.github.com/briancavalier/c4af1538ae9b2e4ab97caf14306625ab\ntype UnZip<A extends readonly unknown[]> = {\n [K in keyof A]: readonly A[K][]\n};\n\n/**\n * This method is like `zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @category Array\n * @param combineFunc - The function to combine grouped values.\n * @param arrays - The arrays to process.\n * @returns Returns the new array of grouped elements.\n * @example\n * zipWith([1, 2], [10, 20], [100, 200], (a, b, c) => a + b + c)\n * // => [111, 222]\n */\n\nexport function zipWith<Args extends unknown[], TOutput>(combineFunc: (...args: Args) => TOutput, ...arrays: UnZip<Args>): TOutput[] {\n const len = Math.min(...arrays.map(a => a.length));\n const zipped: TOutput[] = [];\n for (let i = 0; i < len; i++) {\n // Typescript needs the Args hint, or it infers any[]\n // TODO find a way to avoid the cast\n zipped[i] = combineFunc(...arrays.map(a => a[i]) as Args);\n }\n return zipped;\n}\n","import { zipWith } from '@array/zipWith';\n\n/**\n * Creates an array of grouped elements, the first of which contains the first elements of the given arrays,\n * the second of which contains the second elements of the given arrays, and so on.\n *\n * @category Array\n * @param arrays - The arrays to process.\n * @returns Returns the new array of grouped elements.\n * @example\n * zip(['a', 'b'], [1, 2], [true, false])\n * // => [['a', 1, true], ['b', 2, false]]\n */\n\nexport function zip<TInput>(...arrays: TInput[][]): TInput[][] {\n return zipWith((...t) => t, ...arrays);\n}\n","import type { GenericFunction } from '../types.js';\n\n/**\n * The opposite of `before`. This method creates a function that invokes `func` once it's called `n` or more times.\n *\n * @example\n * const caution = () => console.log(\"Caution!\");\n * const afterFN = after(2, caution);\n *\n * afterFN()\n * afterFN()\n * afterFN()\n * // => `caution` is invoked after called twice\n * @category Function\n * @param n The number of calls before `func` is invoked.\n * @param func The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function after<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc) {\n let count = 1;\n return (...args: Parameters<TFunc>): ReturnType<TFunc> | undefined => {\n if (count >= n) {\n return func(...args);\n }\n count += 1;\n };\n}\n","import type { GenericFunction } from 'src/types.js';\n\n/**\n * Creates a function that invokes `func`, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @category Function\n * @param n - The number of calls at which `func` is no longer invoked.\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n * @example\n * const caution = () => console.log(\"Caution!\");\n *\n * // Only call caution two times\n * const reducedCaution = before(2, caution)\n *\n * reducedCaution()\n * reducedCaution()\n * reducedCaution()\n * // => `caution` is invoked twice\n */\n\nexport function before<TFunc extends GenericFunction<TFunc>>(n: number, func: TFunc): TFunc {\n let count = 0;\n let result: ReturnType<TFunc>;\n return ((...args: Parameters<TFunc>): ReturnType<TFunc> => {\n if (count < n) {\n count += 1;\n result = func(...args);\n }\n return result;\n }) as TFunc;\n}\n","import type { GenericFunction } from 'src/types.js';\n\n// TODO this is a port from lodash, it probably can be improved and shortened, also fix TS errors\nexport function debounce<TFunc extends GenericFunction<TFunc>>(\n fn: TFunc, wait = 0, options: { leading?: boolean, maxWait?: number, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n let lastArgs: Parameters<TFunc> | undefined;\n let lastThis: ThisParameterType<TFunc> | undefined;\n let result: ReturnType<TFunc>;\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n const maxing = options.maxWait ?? false;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n const maxWait = options.maxWait ?? 0;\n\n function invokeFunc(time: number) {\n const args: Parameters<TFunc> | undefined = lastArgs;\n const thisArg: ThisParameterType<TFunc> | undefined = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // @ts-expect-error\n result = fn.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n // @ts-expect-error\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n if (lastCallTime === undefined)\n return true;\n\n const timeSinceLastCall = time - lastCallTime;\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return timeSinceLastCall >= wait || timeSinceLastCall < 0 || (maxing && timeSinceLastInvoke >= maxWait);\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `fn` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>): ReturnType<TFunc> {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = args;\n // TODO Fix this assignment\n // eslint-disable-next-line @typescript-eslint/no-this-alias,unicorn/no-this-assignment\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n","import type{ GenericFunction } from 'src/types.js';\n\nconst defaultResolver = (...args: unknown[]) => JSON.stringify(args);\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, all arguments\n * provided to the memoized function are used as the map cache key.\n *\n * The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @example\n * const object = \\{ 'a': 1, 'b': 2 \\}\n *\n * const values = memoize(values)\n * values(object)\n * // => [1, 2]\n *\n * values(object)\n * // => [1, 2]\n *\n * object.a = 2\n * values(object)\n * // => [2, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b'])\n * values(object)\n * // => ['a', 'b']\n *\n * // Replace `memoize.Cache`.\n * memoize.Cache = WeakMap\n * @category Function\n * @param func - The function to have its output memoized.\n * @param resolver - The function to resolve the cache key.\n * @returns Returns the new memoized function.\n */\n\nexport function memoize<TFunc extends GenericFunction<TFunc>, Cache extends Map<string | symbol, ReturnType<TFunc>>>(\n func: TFunc, resolver: ((...args: Parameters<TFunc>) => string | symbol) = defaultResolver\n): TFunc & { cache: Cache } {\n\n const cache = new Map() as Cache;\n const memoizedFunc = (...args: Parameters<TFunc>): ReturnType<TFunc> => {\n const key = resolver(...args);\n if (cache.has(key)) {\n // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style\n return cache.get(key) as ReturnType<TFunc>;\n }\n const result = func(...args);\n cache.set(key, result);\n return result;\n };\n memoizedFunc.cache = cache;\n return memoizedFunc as TFunc & { cache: Cache };\n}\n","import type { GenericFunction } from 'src/types.js';\n\nimport { before } from '@function/before';\n\n/**\n * Creates a function that is restricted to invoking `func` once.\n * Repeat calls to the function return the value of the first invocation.\n *\n * @example\n * const initialize = once(() => console.log('initialize'))\n * initialize()\n * initialize()\n * // => `createApplication` is invoked once\n *\n * @category Function\n * @param func - The function to restrict.\n * @returns Returns the new restricted function.\n */\n\nexport function once<TFunc extends GenericFunction<TFunc>>(func: TFunc): TFunc {\n return before(1, func);\n}\n","import type { GenericFunction } from 'src/types.js';\n\nimport { debounce } from '@function/debounce';\n\nexport function throttle<TFunc extends GenericFunction<TFunc>>(\n func: TFunc, wait = 0, options: { leading?: boolean, trailing?: boolean } = {}\n): (this: ThisParameterType<TFunc>, ...args: Parameters<TFunc>) => ReturnType<TFunc> {\n return debounce(func, wait, {\n leading: options.leading ?? true,\n maxWait: wait,\n trailing: options.trailing ?? true\n });\n}\n","/**\n * Invokes a function `n` times, returning an array of the results of\n * each invocation.\n *\n * The function is invoked with one argument: `index`\n *\n * @example\n * times(3, index => console.log(\"Run\", index)))\n * // => \"Run 0\" | \"Run 1\" | \"Run 2\"\n * times(3, Math.random)\n * // => [0.123, 0.456, 0.789]\n * times(4, () => 0)\n * // => [0, 0, 0, 0]\n * @category Function\n * @param n - The number of times to invoke `func`.\n * @param func - The function invoked per iteration.\n * @returns Returns an array of results.\n */\n\nexport function times<TInput>(n: number, func: (index: number) => TInput): TInput[] {\n const result: TInput[] = [];\n for (let i = 0; i < n; i++) {\n result.push(func(i));\n }\n return result;\n}","/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @example\n * isEmpty(null)\n * // => true\n *\n * isEmpty({})\n * // => true\n *\n * isEmpty(\"\")\n * // => true\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n * @category Lang\n * @param value - The value to check.\n * @returns Returns `true` if given vlaue is empty, else `false`.\n */\n\nexport function isEmpty(value: string | object | null | undefined): boolean {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (typeof value === 'string' || Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Map || value instanceof Set) {\n return value.size === 0;\n }\n\n if (typeof value === 'object') {\n return Object.keys(value).length === 0;\n }\n\n return false;\n}\n","export function isPlainObject(value: unknown): value is object {\n return value !== null && typeof value === 'object' && value.constructor === Object;\n}\n","/**\n * Creates an object composed of the picked `object` properties.\n *\n * @example\n * const object = { 'a': 1, 'b': '2', 'c': 3 }\n *\n * pick(object, ['a', 'c'])\n * // => { 'a': 1, 'c': 3 }\n * @category Object\n * @param object - The source object.\n * @param keys - The property paths to pick.\n * @returns Returns the new object.\n */\n\nexport function pick<TInput, Key extends keyof TInput>(object: TInput, keys: Key[]): Pick<TInput, Key> {\n const result = {} as Pick<TInput, Key>;\n for (const key of keys) {\n result[key] = object[key];\n }\n return result;\n}\n","/**\n * Deburrs a string by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @example\n * deburr('déjà vu')\n * // => 'deja vu'\n * @category String\n * @param str - The string to deburr.\n * @returns Returns the deburred string.\n */\n\nexport function deburr(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[^\\u0000-\\u007E]/g, (chr: string) =>\n chr.normalize('NFD').replace(/[\\u0300-\\u036F]/g, ''));\n}\n","import { deburr } from '@string/deburr';\n\nexport function splitWords(str: string): string[] {\n str = deburr(str);\n\n // Split non-alphanumeric characters with spaces and deal with camel/PascalCase\n const regex = new RegExp(\n '[^\\\\dA-Za-z]' + // match any character that is not a letter or a digit\n '|' + // or\n '(?<=[a-z])' + // lookbehind for a lowercase letter\n '(?=[A-Z])' + // lookahead for an uppercase letter\n '|' + // or\n '(?<=[A-Z])' + // lookbehind for an uppercase letter\n '(?=[A-Z][a-z])' // lookahead for an uppercase letter followed by a lowercase letter\n );\n\n return str.split(regex).filter(Boolean);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts `string` to camelCase.\n *\n * @example\n * camelCase('Foo Bar')\n * // => 'fooBar'\n * camelCase('--foo-bar--')\n * // => 'fooBar'\n * camelCase('__FOO_BAR__')\n * // => 'fooBar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the camel cased string.\n */\n\nexport function camelCase(str: string): string {\n const words = splitWords(str);\n\n // Capitalize the first letter of each word\n const camelCase = words.map((word, index) => {\n if (index === 0) {\n return word.toLowerCase();\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return camelCase.join('');\n}\n","/**\n * Converts the first character of a string to upper case and the remaining to lower case.\n *\n * @example\n * capitalize('FRED')\n * // => 'Fred'\n * @category String\n * @param str - The string to capitalize.\n * @returns Returns the capitalized string.\n */\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Converts the characters `&`, `<`, `>`, `\"` and `'` in a string to their corresponding HTML entities.\n *\n * @example\n * escape('fred, barney, & pebbles')\n * // => 'fred, barney, &amp; pebbles'\n * @category String\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escape(str: string): string {\n const escapeChars: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\\'': '&#39;',\n '\"': '&quot;'\n };\n return str.replace(/[\"&'<>]/g, char => escapeChars[char] || char);\n}\n","/**\n * Escapes the `RegExp` special characters `^`, `$`, `\\`, `.`, `*`, `+`,\n * `?`, `(`, `)`, `[`, `]`, `{`, `}`, and `|` in a string.\n *\n * @example\n * escapeRegExp('[moderndash](https://moderndash.io/)')\n * // => '\\[moderndash\\]\\(https://moderndash\\.io/\\)'\n * @category String\n * @param str - The string to escape.\n * @returns Returns the escaped string.\n */\n\nexport function escapeRegExp(str: string): string {\n return str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * kebabCase('Foo Bar')\n * // => 'foo-bar'\n * kebabCase('fooBar')\n * // => 'foo-bar'\n * kebabCase('__FOO_BAR__')\n * // => 'foo-bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the kebab cased string.\n */\n\nexport function kebabCase(str: string): string {\n const words = splitWords(str);\n let kebabCase = '';\n for (const word of words) {\n kebabCase += word.toLowerCase() + '-';\n }\n return kebabCase.slice(0, -1);\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n\n/**\n * Converts a string to PascalCase.\n *\n * @example\n * pascalCase('Foo Bar')\n * // => 'FooBar'\n * pascalCase('fooBar')\n * // => 'FooBar'\n * pascalCase('__FOO_BAR__')\n * // => 'FooBar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the pascal cased string.\n */\n\nexport function pascalCase(str: string): string {\n const words = splitWords(str);\n let pascalCase = '';\n for (const word of words) {\n pascalCase += word.charAt(0).toUpperCase() + word.slice(1);\n }\n return pascalCase;\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to snake_case.\n *\n * @example\n * snakeCase('Foo Bar')\n * // => 'foo_bar'\n * snakeCase('fooBar')\n * // => 'foo_bar'\n * snakeCase('--FOO-BAR--')\n * // => 'foo_bar'\n * snakeCase('foo2bar')\n * // => 'foo_2_bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the snake cased string.\n */\n\nexport function snakeCase(str: string): string {\n const words = splitWords(str);\n let snakeCase = '';\n for (const word of words) {\n if (snakeCase.length > 0) {\n snakeCase += '_';\n }\n snakeCase += word.toLowerCase();\n }\n return snakeCase;\n}\n","import { splitWords } from '@helpers/stringModifiers';\n\n/**\n * Converts a string to Start Case.\n *\n * @example\n * startCase('--foo-bar--')\n * // => 'Foo Bar'\n * startCase('fooBar')\n * // => 'Foo Bar'\n * startCase('__FOO_BAR__')\n * // => 'Foo Bar'\n * @category String\n * @param str - The string to convert.\n * @returns Returns the start cased string.\n */\n\nexport function startCase(str: string): string {\n const words = splitWords(str);\n let startCase = '';\n for (const word of words) {\n startCase += word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ' ';\n }\n return startCase.trimEnd();\n}\n","import { deburr } from '@string/deburr';\n\n/**\n * Removes all special characters from a string.\n *\n * @example\n * stripSpecialChars('Héllo! World #$%&*!')\n * // => 'Hello World'\n * @category String\n * @param str - The string to remove special characters from.\n * @returns Returns the string with special characters removed.\n*/\n\nexport function stripSpecial(str: string): string {\n str = deburr(str);\n return str.replace(/[^\\s\\w]/gi, '');\n}\n","/**\n * Converts the HTML entities `&amp;`, `&lt;`, `&gt;`, `&quot;` and `&#39;`\n * in a string to their corresponding characters.\n *\n * @example\n * unescape('fred, barney, &amp; pebbles')\n * // => 'fred, barney, & pebbles'\n * @category String\n * @param str - The string to unescape.\n * @returns Returns the unescaped string.\n */\n\nexport function unescape(str: string): string {\n const entityMap: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': '\\''\n };\n return str.replace(/&(?:amp|lt|gt|quot|#(0+)?39);/g, (entity: string) => entityMap[entity] || entity);\n}\n"],"mappings":"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","names":["difference","intersection","count","count","camelCase","kebabCase","pascalCase","snakeCase","startCase"]}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "moderndash",
3
3
  "type": "module",
4
- "description": "A lodash inspired utility framework for ESM/Typescript/ES2020",
4
+ "description": "A lodash inspired utility framework for ESM/Typescript/ESNext",
5
+ "sideEffects": false,
5
6
  "scripts": {
6
7
  "build": "ctix create ----startAt src --overwrite --noBackup & tsup",
7
8
  "prepublishOnly": "npm run build && @powershell cp '../README.md' './README.md' && @powershell cp '../LICENSE' './LICENSE'",
@@ -18,7 +19,8 @@
18
19
  "utility",
19
20
  "helper",
20
21
  "underscore",
21
- "esm"
22
+ "esm",
23
+ "typescript"
22
24
  ],
23
25
  "author": "Maggi64",
24
26
  "license": "MIT",
@@ -36,8 +38,7 @@
36
38
  }
37
39
  },
38
40
  "files": [
39
- "dist",
40
- "src"
41
+ "dist"
41
42
  ],
42
43
  "homepage": "https://moderndash.io",
43
44
  "devDependencies": {
@@ -47,5 +48,5 @@
47
48
  "tsup": "6.5.0",
48
49
  "ctix": "1.8.1"
49
50
  },
50
- "version": "0.0.16"
51
+ "version": "0.0.18"
51
52
  }
@@ -1,31 +0,0 @@
1
- /**
2
- * Creates an array of elements split into groups the length of size. If array can't be split evenly, the final chunk will be the remaining elements.
3
- *
4
- * @category Array
5
- * @returns Returns the new array of chunks.
6
- * @param chunkSize - The array to process.
7
- * @param array - The length of each chunk
8
- * @example
9
- * chunk(2, ['a', 'b', 'c', 'd'])
10
- * // => [['a', 'b'], ['c', 'd']]
11
- *
12
- * chunk(3, ['a', 'b', 'c', 'd'])
13
- * // => [['a', 'b', 'c'], ['d']]
14
- */
15
-
16
- export function chunk<TInput>(chunkSize: number, array: TInput[]): TInput[][] {
17
- const sizeInteger = Math.trunc(chunkSize);
18
- if (array.length === 0 || sizeInteger < 1) {
19
- return [];
20
- }
21
-
22
- const chunkedArray = [];
23
- let i = 0;
24
-
25
- while (i < array.length) {
26
- chunkedArray.push(array.slice(i, i + sizeInteger));
27
- i += sizeInteger;
28
- }
29
-
30
- return chunkedArray;
31
- }
@@ -1,21 +0,0 @@
1
- import type { MinimumTwoArrays } from '../types';
2
-
3
- import { differenceWith } from '@array/differenceWith';
4
- import { isEqual } from '@lang/isEqual';
5
-
6
- /**
7
- * Creates an array of `array` values not included in the other given arrays. The order and references of result values are determined by the first array.
8
- *
9
- * **Note:** Unlike `pullAll`, this method returns a new array.
10
- *
11
- * @category Array
12
- * @param arrays - First array is inspected, others are excluded.
13
- * @returns Returns the new array of filtered values.
14
- * @example
15
- * difference([2, 1], [2, 3])
16
- * // => [1]
17
- */
18
-
19
- export function difference<TInput>(...arrays: MinimumTwoArrays<TInput>): TInput[] {
20
- return differenceWith(isEqual, ...arrays);
21
- }