@softwareventures/array 6.0.3 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2018-2022 Software Ventures Limited.
1
+ Copyright 2018-2023 Software Ventures Limited.
2
2
 
3
3
  Permission to use, copy, modify, and/or distribute this software for any purpose
4
4
  with or without fee is hereby granted, provided that the above copyright notice
package/index.d.ts CHANGED
@@ -80,12 +80,20 @@ export declare function contains<T>(array: ArrayLike<T>, value: T): boolean;
80
80
  export declare function containsFn<T>(value: T): (array: ArrayLike<T>) => boolean;
81
81
  export declare function indexOf<T>(array: ArrayLike<T>, value: T): number | null;
82
82
  export declare function indexOfFn<T>(value: T): (array: ArrayLike<T>) => number | null;
83
+ export declare function lastIndexOf<T>(array: ArrayLike<T>, value: T): number | null;
84
+ export declare function lastIndexOfFn<T>(value: T): (array: ArrayLike<T>) => number | null;
83
85
  export declare function findIndex<T>(array: ArrayLike<T>, predicate: (element: T, index: number) => boolean): number | null;
84
86
  export declare function findIndexFn<T>(predicate: (element: T, index: number) => boolean): (array: ArrayLike<T>) => number | null;
87
+ export declare function findLastIndex<T>(array: ArrayLike<T>, predicate: (element: T, index: number) => boolean): number | null;
88
+ export declare function findLastIndexFn<T>(predicate: (element: T, index: number) => boolean): (array: ArrayLike<T>) => number | null;
85
89
  export declare function find<T, U extends T>(array: ArrayLike<T>, predicate: (element: T) => element is U): U | null;
86
90
  export declare function find<T>(array: ArrayLike<T>, predicate: (element: T, index: number) => boolean): T | null;
87
91
  export declare function findFn<T, U extends T>(predicate: (element: T) => element is U): (array: ArrayLike<T>) => U | null;
88
92
  export declare function findFn<T>(predicate: (element: T, index: number) => boolean): (array: ArrayLike<T>) => T | null;
93
+ export declare function findLast<T, U extends T>(array: ArrayLike<T>, predicate: (element: T) => element is U): U | null;
94
+ export declare function findLast<T>(array: ArrayLike<T>, predicate: (element: T, index: number) => boolean): T | null;
95
+ export declare function findLastFn<T, U extends T>(predicate: (element: T) => element is U): (array: ArrayLike<T>) => U | null;
96
+ export declare function findLastFn<T>(predicate: (element: T, index: number) => boolean): (array: ArrayLike<T>) => T | null;
89
97
  export declare function maximum<T extends string | number | boolean>(array: ArrayLike<T>): T | null;
90
98
  export declare function maximum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null;
91
99
  export declare function maximumFn<T extends string | number | boolean>(): (array: ArrayLike<T>) => T | null;
package/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.removeFn = exports.remove = exports.excludeFirstFn = exports.excludeFirst = exports.excludeNull = exports.excludeFn = exports.exclude = exports.filterFirstFn = exports.filterFirst = exports.filterFn = exports.filter = exports.mapFn = exports.map = exports.prefixMatchFn = exports.prefixMatch = exports.notEqualFn = exports.notEqual = exports.equalFn = exports.equal = exports.dropUntilFn = exports.dropUntil = exports.dropWhileFn = exports.dropWhile = exports.takeUntilFn = exports.takeUntil = exports.takeWhileFn = exports.takeWhile = exports.dropFn = exports.drop = exports.takeFn = exports.take = exports.sliceFn = exports.slice = exports.reverse = exports.notEmpty = exports.empty = exports.only = exports.last = exports.initial = exports.unshiftFn = exports.unshift = exports.pushFn = exports.push = exports.tail = exports.head = exports.first = exports.coerce = exports.isArrayLike = exports.isArray = exports.copy = void 0;
4
- exports.scanRight = exports.scan1Fn = exports.scan1 = exports.scanFn = exports.scan = exports.noneNull = exports.concatMapFn = exports.concatMap = exports.append = exports.prepend = exports.concat = exports.allFn = exports.all = exports.anyFn = exports.any = exports.or = exports.and = exports.average = exports.product = exports.sum = exports.minimumByFn = exports.minimumBy = exports.minimumFn = exports.minimum = exports.maximumByFn = exports.maximumBy = exports.maximumFn = exports.maximum = exports.findFn = exports.find = exports.findIndexFn = exports.findIndex = exports.indexOfFn = exports.indexOf = exports.containsFn = exports.contains = exports.foldMapRightFn = exports.foldMapRight = exports.foldMapFn = exports.foldMap = exports.foldRight1Fn = exports.foldRight1 = exports.foldRightFn = exports.foldRight = exports.fold1Fn = exports.fold1 = exports.foldFn = exports.fold = exports.removeFirstFn = exports.removeFirst = void 0;
5
- exports.unique = exports.groupAdjacentByHashFn = exports.groupAdjacentByHash = exports.groupAdjacentByOrderFn = exports.groupAdjacentByOrder = exports.groupAdjacentByEqualityFn = exports.groupAdjacentByEquality = exports.groupAdjacentByIdentityFn = exports.groupAdjacentByIdentity = exports.groupAdjacentFn = exports.groupAdjacent = exports.groupByOrderWithHashFn = exports.groupByOrderWithHash = exports.groupByEqualityWithHashFn = exports.groupByEqualityWithHash = exports.groupByHashFn = exports.groupByHash = exports.groupByOrderFn = exports.groupByOrder = exports.groupByEqualityFn = exports.groupByEquality = exports.groupByIdentityFn = exports.groupByIdentity = exports.groupFn = exports.group = exports.mapKeyLastByFn = exports.mapKeyLastBy = exports.mapKeyFirstByFn = exports.mapKeyFirstBy = exports.mapKeyByFn = exports.mapKeyBy = exports.keyLastByFn = exports.keyLastBy = exports.keyFirstByFn = exports.keyFirstBy = exports.keyByFn = exports.keyBy = exports.zipFn = exports.zip = exports.partitionUntilFn = exports.partitionUntil = exports.partitionWhileFn = exports.partitionWhile = exports.partitionFn = exports.partition = exports.splitFn = exports.split = exports.scanRight1Fn = exports.scanRight1 = exports.scanRightFn = void 0;
6
- exports.forEachFn = exports.forEach = exports.sortByDescendingFn = exports.sortByDescending = exports.sortByFn = exports.sortBy = exports.sortFn = exports.sort = exports.shuffle = exports.uniqueAdjacentByHashFn = exports.uniqueAdjacentByHash = exports.uniqueAdjacentByOrderFn = exports.uniqueAdjacentByOrder = exports.uniqueAdjacentByEqualityFn = exports.uniqueAdjacentByEquality = exports.uniqueAdjacentByIdentityFn = exports.uniqueAdjacentByIdentity = exports.uniqueAdjacentFn = exports.uniqueAdjacent = exports.uniqueByOrderWithHashFn = exports.uniqueByOrderWithHash = exports.uniqueByEqualityWithHashFn = exports.uniqueByEqualityWithHash = exports.uniqueByHashFn = exports.uniqueByHash = exports.uniqueByOrderFn = exports.uniqueByOrder = exports.uniqueByEqualityFn = exports.uniqueByEquality = exports.uniqueByIdentity = exports.uniqueFn = void 0;
4
+ exports.concatMapFn = exports.concatMap = exports.append = exports.prepend = exports.concat = exports.allFn = exports.all = exports.anyFn = exports.any = exports.or = exports.and = exports.average = exports.product = exports.sum = exports.minimumByFn = exports.minimumBy = exports.minimumFn = exports.minimum = exports.maximumByFn = exports.maximumBy = exports.maximumFn = exports.maximum = exports.findLastFn = exports.findLast = exports.findFn = exports.find = exports.findLastIndexFn = exports.findLastIndex = exports.findIndexFn = exports.findIndex = exports.lastIndexOfFn = exports.lastIndexOf = exports.indexOfFn = exports.indexOf = exports.containsFn = exports.contains = exports.foldMapRightFn = exports.foldMapRight = exports.foldMapFn = exports.foldMap = exports.foldRight1Fn = exports.foldRight1 = exports.foldRightFn = exports.foldRight = exports.fold1Fn = exports.fold1 = exports.foldFn = exports.fold = exports.removeFirstFn = exports.removeFirst = void 0;
5
+ exports.groupAdjacentByEquality = exports.groupAdjacentByIdentityFn = exports.groupAdjacentByIdentity = exports.groupAdjacentFn = exports.groupAdjacent = exports.groupByOrderWithHashFn = exports.groupByOrderWithHash = exports.groupByEqualityWithHashFn = exports.groupByEqualityWithHash = exports.groupByHashFn = exports.groupByHash = exports.groupByOrderFn = exports.groupByOrder = exports.groupByEqualityFn = exports.groupByEquality = exports.groupByIdentityFn = exports.groupByIdentity = exports.groupFn = exports.group = exports.mapKeyLastByFn = exports.mapKeyLastBy = exports.mapKeyFirstByFn = exports.mapKeyFirstBy = exports.mapKeyByFn = exports.mapKeyBy = exports.keyLastByFn = exports.keyLastBy = exports.keyFirstByFn = exports.keyFirstBy = exports.keyByFn = exports.keyBy = exports.zipFn = exports.zip = exports.partitionUntilFn = exports.partitionUntil = exports.partitionWhileFn = exports.partitionWhile = exports.partitionFn = exports.partition = exports.splitFn = exports.split = exports.scanRight1Fn = exports.scanRight1 = exports.scanRightFn = exports.scanRight = exports.scan1Fn = exports.scan1 = exports.scanFn = exports.scan = exports.noneNull = void 0;
6
+ exports.forEachFn = exports.forEach = exports.sortByDescendingFn = exports.sortByDescending = exports.sortByFn = exports.sortBy = exports.sortFn = exports.sort = exports.shuffle = exports.uniqueAdjacentByHashFn = exports.uniqueAdjacentByHash = exports.uniqueAdjacentByOrderFn = exports.uniqueAdjacentByOrder = exports.uniqueAdjacentByEqualityFn = exports.uniqueAdjacentByEquality = exports.uniqueAdjacentByIdentityFn = exports.uniqueAdjacentByIdentity = exports.uniqueAdjacentFn = exports.uniqueAdjacent = exports.uniqueByOrderWithHashFn = exports.uniqueByOrderWithHash = exports.uniqueByEqualityWithHashFn = exports.uniqueByEqualityWithHash = exports.uniqueByHashFn = exports.uniqueByHash = exports.uniqueByOrderFn = exports.uniqueByOrder = exports.uniqueByEqualityFn = exports.uniqueByEquality = exports.uniqueByIdentity = exports.uniqueFn = exports.unique = exports.groupAdjacentByHashFn = exports.groupAdjacentByHash = exports.groupAdjacentByOrderFn = exports.groupAdjacentByOrder = exports.groupAdjacentByEqualityFn = void 0;
7
7
  const nullable_1 = require("@softwareventures/nullable");
8
8
  const ordered_1 = require("@softwareventures/ordered");
9
9
  // eslint-disable-next-line @typescript-eslint/unbound-method
@@ -30,6 +30,7 @@ exports.copy = Array.from;
30
30
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
31
31
  // @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.
32
32
  exports.isArray = Array.isArray;
33
+ // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
33
34
  function isArrayLike(value) {
34
35
  return (typeof value === "object" &&
35
36
  value != null &&
@@ -351,6 +352,19 @@ function indexOfFn(value) {
351
352
  return array => indexOf(array, value);
352
353
  }
353
354
  exports.indexOfFn = indexOfFn;
355
+ function lastIndexOf(array, value) {
356
+ for (let i = array.length - 1; i >= 0; --i) {
357
+ if (array[i] === value) {
358
+ return i;
359
+ }
360
+ }
361
+ return null;
362
+ }
363
+ exports.lastIndexOf = lastIndexOf;
364
+ function lastIndexOfFn(value) {
365
+ return array => lastIndexOf(array, value);
366
+ }
367
+ exports.lastIndexOfFn = lastIndexOfFn;
354
368
  function findIndex(array, predicate) {
355
369
  const index = nativeFindIndex.call(array, predicate);
356
370
  return index === -1 ? null : index;
@@ -360,6 +374,19 @@ function findIndexFn(predicate) {
360
374
  return array => findIndex(array, predicate);
361
375
  }
362
376
  exports.findIndexFn = findIndexFn;
377
+ function findLastIndex(array, predicate) {
378
+ for (let i = array.length - 1; i >= 0; --i) {
379
+ if (predicate(array[i], i)) {
380
+ return i;
381
+ }
382
+ }
383
+ return null;
384
+ }
385
+ exports.findLastIndex = findLastIndex;
386
+ function findLastIndexFn(predicate) {
387
+ return array => findLastIndex(array, predicate);
388
+ }
389
+ exports.findLastIndexFn = findLastIndexFn;
363
390
  function find(array, predicate) {
364
391
  const index = findIndex(array, predicate);
365
392
  return index == null ? null : array[index];
@@ -369,6 +396,20 @@ function findFn(predicate) {
369
396
  return array => find(array, predicate);
370
397
  }
371
398
  exports.findFn = findFn;
399
+ function findLast(array, predicate) {
400
+ for (let i = array.length - 1; i >= 0; --i) {
401
+ const element = array[i];
402
+ if (predicate(element, i)) {
403
+ return element;
404
+ }
405
+ }
406
+ return null;
407
+ }
408
+ exports.findLast = findLast;
409
+ function findLastFn(predicate) {
410
+ return array => findLast(array, predicate);
411
+ }
412
+ exports.findLastFn = findLastFn;
372
413
  function maximum(array, compare) {
373
414
  return internalMaximum(array, compare !== null && compare !== void 0 ? compare : ordered_1.compare);
374
415
  }
@@ -383,7 +424,7 @@ function internalMaximum(array, compare) {
383
424
  }
384
425
  let result = array[0];
385
426
  for (let i = 1; i < array.length; ++i) {
386
- if (compare(array[i], result) > 0) {
427
+ if (compare(array[i], result) > ordered_1.Comparison.equal) {
387
428
  result = array[i];
388
429
  }
389
430
  }
@@ -411,7 +452,7 @@ function internalMinimum(array, compare) {
411
452
  }
412
453
  let result = array[0];
413
454
  for (let i = 1; i < array.length; ++i) {
414
- if (compare(array[i], result) < 0) {
455
+ if (compare(array[i], result) < ordered_1.Comparison.equal) {
415
456
  result = array[i];
416
457
  }
417
458
  }
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import {isNotNull, isNull, notNull} from \"@softwareventures/nullable\";\nimport type {Comparator} from \"@softwareventures/ordered\";\nimport {\n compare as defaultCompare,\n Comparison,\n equal as defaultEqual\n} from \"@softwareventures/ordered\";\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeSlice = Array.prototype.slice;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeReverse = Array.prototype.reverse;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeConcat = Array.prototype.concat;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeFilter = Array.prototype.filter;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeReduce = Array.prototype.reduce;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeReduceRight = Array.prototype.reduceRight;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeIndexOf = Array.prototype.indexOf;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeFindIndex = Array.prototype.findIndex;\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\nexport function copy<T>(array: ArrayLike<T>): T[];\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const copy: <T>(array: ArrayLike<T>) => T[] = Array.from;\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\nexport function isArray<T = unknown>(value: readonly T[] | unknown): value is readonly T[];\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const isArray: (value: unknown) => value is unknown[] = Array.isArray;\n\nexport function isArrayLike<T>(value: ArrayLike<T> | unknown): value is ArrayLike<T> {\n return (\n typeof value === \"object\" &&\n value != null &&\n \"length\" in value &&\n typeof (value as {length: unknown}).length === \"number\"\n );\n}\n\nexport function coerce<T>(array: ArrayLike<T>): readonly T[] {\n return isArray(array) ? (array as readonly T[]) : copy(array);\n}\n\nexport function first<T>(array: ArrayLike<T>): T | null {\n return array.length === 0 ? null : (array[0] as T);\n}\n\n/** @deprecated Use {@link first} instead. */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\nexport function head<T>(array: ArrayLike<T>): T | null;\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const head = first;\n\nexport function tail<T>(array: ArrayLike<T>): T[] {\n return nativeSlice.call(array, 1) as T[];\n}\n\nexport function push<T>(array: ArrayLike<T>, value: T): T[] {\n return [...coerce(array), value];\n}\n\nexport function pushFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => push(array, value);\n}\n\nexport function unshift<T>(array: ArrayLike<T>, value: T): T[] {\n return [value, ...coerce(array)];\n}\n\nexport function unshiftFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => unshift(array, value);\n}\n\nexport function initial<T>(array: ArrayLike<T>): T[] {\n return array.length === 0 ? [] : (nativeSlice.call(array, 0, array.length - 1) as T[]);\n}\n\nexport function last<T>(array: ArrayLike<T>): T | null {\n return array.length === 0 ? null : (array[array.length - 1] as T);\n}\n\n/** If the array contains exactly one element, returns that element.\n * Otherwise, returns null. */\nexport function only<T>(array: ArrayLike<T>): T | null {\n return array.length === 1 ? (array[0] as T) : null;\n}\n\nexport function empty<T>(array: ArrayLike<T>): boolean {\n return array.length === 0;\n}\n\nexport function notEmpty<T>(array: ArrayLike<T>): boolean {\n return array.length > 0;\n}\n\nexport function reverse<T>(array: ArrayLike<T>): T[] {\n return nativeReverse.call(copy(array)) as T[];\n}\n\nexport function slice<T>(array: ArrayLike<T>, start?: number, end?: number): T[] {\n return nativeSlice.call(array, start, end) as T[];\n}\n\nexport function sliceFn<T>(start?: number, end?: number): (array: ArrayLike<T>) => T[] {\n return array => nativeSlice.call(array, start, end) as T[];\n}\n\nexport function take<T>(array: ArrayLike<T>, count: number): T[] {\n return nativeSlice.call(array, 0, count) as T[];\n}\n\nexport function takeFn<T>(count: number): (array: ArrayLike<T>) => T[] {\n return array => nativeSlice.call(array, 0, count) as T[];\n}\n\nexport function drop<T>(array: ArrayLike<T>, count: number): T[] {\n return nativeSlice.call(array, count) as T[];\n}\n\nexport function dropFn<T>(count: number): (array: ArrayLike<T>) => T[] {\n return array => nativeSlice.call(array, count) as T[];\n}\n\nexport function takeWhile<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => element is U\n): U[];\nexport function takeWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[];\nexport function takeWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n let i = 0;\n while (i < array.length && predicate(array[i] as T, i)) {\n ++i;\n }\n return take(array, i);\n}\n\nexport function takeWhileFn<T, U extends T>(\n predicate: (element: T, index: number) => element is U\n): (array: ArrayLike<T>) => U[];\nexport function takeWhileFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[];\nexport function takeWhileFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => takeWhile(array, predicate);\n}\n\nexport function takeUntil<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return takeWhile(array, (element, index) => !predicate(element, index));\n}\n\nexport function takeUntilFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => takeUntil(array, predicate);\n}\n\nexport function dropWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n let i = 0;\n while (i < array.length && predicate(array[i] as T, i)) {\n ++i;\n }\n return drop(array, i);\n}\n\nexport function dropWhileFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => dropWhile(array, predicate);\n}\n\nexport function dropUntil<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return dropWhile(array, (element, index) => !predicate(element, index));\n}\n\nexport function dropUntilFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => dropWhile(array, predicate);\n}\n\nexport function equal<T>(\n a: ArrayLike<T>,\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; ++i) {\n if (!elementsEqual(a[i] as T, b[i] as T)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function equalFn<T>(\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): (a: ArrayLike<T>) => boolean {\n return a => equal(a, b, elementsEqual);\n}\n\nexport function notEqual<T>(\n a: ArrayLike<T>,\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): boolean {\n return !equal(a, b, elementsEqual);\n}\n\nexport function notEqualFn<T>(\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): (a: ArrayLike<T>) => boolean {\n return a => notEqual(a, b, elementsEqual);\n}\n\nexport function prefixMatch<T>(\n a: ArrayLike<T>,\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): boolean {\n if (a.length < b.length) {\n return false;\n }\n\n for (let i = 0; i < b.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function prefixMatchFn<T>(\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): (a: ArrayLike<T>) => boolean {\n return a => prefixMatch(a, b, elementsEqual);\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\nexport function map<T, U>(array: ArrayLike<T>, f: (element: T, index: number) => U): U[];\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const map: <T, U>(array: ArrayLike<T>, f: (element: T, index: number) => U) => U[] =\n Array.from;\n\nexport function mapFn<T, U>(f: (element: T, index: number) => U): (array: ArrayLike<T>) => U[] {\n return array => Array.from(array, f);\n}\n\nexport function filter<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => element is U\n): U[];\nexport function filter<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[];\nexport function filter<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return nativeFilter.call(array, predicate) as T[];\n}\n\nexport function filterFn<T, U extends T>(\n predicate: (element: T, index: number) => element is U\n): (array: ArrayLike<T>) => U[];\nexport function filterFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[];\nexport function filterFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => nativeFilter.call(array, predicate) as T[];\n}\n\n/** @deprecated This function is confusing, use {@link excludeFirst} instead,\n * and invert the predicate. */\nexport function filterFirst<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n const result: T[] = [];\n let i = 0;\n for (; i < array.length; ++i) {\n const element = array[i] as T;\n if (predicate(element, i)) {\n result.push(element);\n } else {\n break;\n }\n }\n for (++i; i < array.length; ++i) {\n result.push(array[i] as T);\n }\n return result;\n}\n\n/** @deprecated This function is confusing, use {@link excludeFirstFn} instead,\n * and invert the predicate. */\nexport function filterFirstFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => filterFirst(array, predicate);\n}\n\nexport function exclude<T, U>(\n array: ArrayLike<T | U>,\n predicate: (element: T | U) => element is T\n): U[];\nexport function exclude<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[];\nexport function exclude<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return filter(array, (element, index) => !predicate(element, index));\n}\n\nexport function excludeFn<T, U>(\n predicate: (element: T | U) => element is T\n): (array: ArrayLike<T | U>) => T[];\nexport function excludeFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[];\nexport function excludeFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => exclude(array, predicate);\n}\n\nexport function excludeNull<T>(array: ArrayLike<T | null | undefined>): T[] {\n return filter(array, isNotNull);\n}\n\nexport function excludeFirst<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return filterFirst(array, (element, index) => !predicate(element, index));\n}\n\nexport function excludeFirstFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => excludeFirst(array, predicate);\n}\n\nexport function remove<T>(array: ArrayLike<T>, value: T): T[] {\n return exclude(array, element => element === value);\n}\n\nexport function removeFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => remove(array, value);\n}\n\nexport function removeFirst<T>(array: ArrayLike<T>, value: T): T[] {\n return excludeFirst(array, element => element === value);\n}\n\nexport function removeFirstFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => removeFirst(array, value);\n}\n\nexport function fold<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U {\n return (\n nativeReduce as (f: (accumulator: U, element: T, index: number) => U, initial: U) => U\n ).call(array, f, initial);\n}\n\nexport function foldFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array =>\n (\n nativeReduce as (f: (accumulator: U, element: T, index: number) => U, initial: U) => U\n ).call(array, f, initial);\n}\n\nexport function fold1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T {\n return (nativeReduce as (f: (accumulator: T, element: T, index: number) => T) => T).call(\n array,\n f\n );\n}\n\nexport function fold1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T {\n return array => fold1(array, f);\n}\n\nexport function foldRight<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U {\n return (\n nativeReduceRight as (f: (accumulator: U, element: T, index: number) => U, initial: U) => U\n ).call(array, f, initial);\n}\n\nexport function foldRightFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array =>\n (\n nativeReduceRight as (\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n ) => U\n ).call(array, f, initial);\n}\n\nexport function foldRight1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T {\n return (nativeReduceRight as (f: (accumulator: T, element: T, index: number) => T) => T).call(\n array,\n f\n );\n}\n\nexport function foldRight1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T {\n return array => foldRight1(array, f);\n}\n\nexport function foldMap<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): U {\n let accumulator = initial;\n for (let i = 0; i < array.length; ++i) {\n accumulator = f(accumulator, m(array[i] as T, i), i);\n }\n\n return accumulator;\n}\n\nexport function foldMapFn<T, U>(\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array => foldMap(array, f, m, initial);\n}\n\nexport function foldMapRight<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): U {\n let accumulator = initial;\n const length = array.length;\n for (let i = 0; i < array.length; ++i) {\n accumulator = f(accumulator, m(array[length - i] as T, i), i);\n }\n\n return accumulator;\n}\n\nexport function foldMapRightFn<T, U>(\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array => foldMapRight(array, f, m, initial);\n}\n\nexport function contains<T>(array: ArrayLike<T>, value: T): boolean {\n return nativeIndexOf.call(array, value) !== -1;\n}\n\nexport function containsFn<T>(value: T): (array: ArrayLike<T>) => boolean {\n return array => nativeIndexOf.call(array, value) !== -1;\n}\n\nexport function indexOf<T>(array: ArrayLike<T>, value: T): number | null {\n const index = nativeIndexOf.call(array, value);\n return index === -1 ? null : index;\n}\n\nexport function indexOfFn<T>(value: T): (array: ArrayLike<T>) => number | null {\n return array => indexOf(array, value);\n}\n\nexport function findIndex<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): number | null {\n const index = nativeFindIndex.call(array, predicate);\n return index === -1 ? null : index;\n}\n\nexport function findIndexFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => number | null {\n return array => findIndex(array, predicate);\n}\n\nexport function find<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T) => element is U\n): U | null;\nexport function find<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T | null;\nexport function find<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T | null {\n const index = findIndex(array, predicate);\n return index == null ? null : (array[index] as T);\n}\n\nexport function findFn<T, U extends T>(\n predicate: (element: T) => element is U\n): (array: ArrayLike<T>) => U | null;\nexport function findFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T | null;\nexport function findFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T | null {\n return array => find(array, predicate);\n}\n\nexport function maximum<T extends string | number | boolean>(array: ArrayLike<T>): T | null;\nexport function maximum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null;\nexport function maximum<T>(array: ArrayLike<T>, compare?: Comparator<T>): T | null {\n return internalMaximum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nexport function maximumFn<T extends string | number | boolean>(): (array: ArrayLike<T>) => T | null;\nexport function maximumFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T | null;\nexport function maximumFn<T>(compare?: Comparator<T>): (array: ArrayLike<T>) => T | null {\n return array => internalMaximum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nfunction internalMaximum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null {\n if (array.length === 0) {\n return null;\n }\n\n let result = array[0] as T;\n\n for (let i = 1; i < array.length; ++i) {\n if (compare(array[i] as T, result) > 0) {\n result = array[i] as T;\n }\n }\n\n return result;\n}\n\nexport function maximumBy<T>(array: ArrayLike<T>, select: (element: T) => number): T | null {\n return maximum(array, (a, b) => defaultCompare(select(a), select(b)));\n}\n\nexport function maximumByFn<T>(select: (element: T) => number): (array: ArrayLike<T>) => T | null {\n return array => maximumBy(array, select);\n}\n\nexport function minimum<T extends string | number | boolean>(array: ArrayLike<T>): T | null;\nexport function minimum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null;\nexport function minimum<T>(array: ArrayLike<T>, compare?: Comparator<T>): T | null {\n return internalMinimum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nexport function minimumFn<T extends string | number | boolean>(): (array: ArrayLike<T>) => T | null;\nexport function minimumFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T | null;\nexport function minimumFn<T>(compare?: Comparator<T>): (array: ArrayLike<T>) => T | null {\n return array => internalMinimum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nfunction internalMinimum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null {\n if (array.length === 0) {\n return null;\n }\n\n let result = array[0] as T;\n\n for (let i = 1; i < array.length; ++i) {\n if (compare(array[i] as T, result) < 0) {\n result = array[i] as T;\n }\n }\n\n return result;\n}\n\nexport function minimumBy<T>(array: ArrayLike<T>, select: (element: T) => number): T | null {\n return minimum(array, (a, b) => defaultCompare(select(a), select(b)));\n}\n\nexport function minimumByFn<T>(select: (element: T) => number): (array: ArrayLike<T>) => T | null {\n return array => minimumBy(array, select);\n}\n\nexport function sum(array: ArrayLike<number>): number {\n return fold(array, (a, b) => a + b, 0);\n}\n\nexport function product(array: ArrayLike<number>): number {\n return fold(array, (a, b) => a * b, 1);\n}\n\nexport function average(array: ArrayLike<number>): number | null {\n if (array.length === 0) {\n return null;\n } else {\n return sum(array) / array.length;\n }\n}\n\nexport function and(array: ArrayLike<boolean>): boolean {\n return findIndex(array, element => !element) == null;\n}\n\nexport function or(array: ArrayLike<boolean>): boolean {\n return findIndex(array, element => Boolean(element)) != null;\n}\n\nexport function any<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): boolean {\n return findIndex(array, predicate) != null;\n}\n\nexport function anyFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => boolean {\n return array => any(array, predicate);\n}\n\nexport function all<T, U extends T>(\n array: readonly T[],\n predicate: (element: T, index: number) => element is U\n): array is readonly U[];\nexport function all<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => element is U\n): array is ArrayLike<U>;\nexport function all<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): boolean;\nexport function all<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): boolean {\n return !any(array, (element, index) => !predicate(element, index));\n}\n\nexport function allFn<T, U extends T>(\n predicate: (element: T, index: number) => element is U\n): (array: ArrayLike<T>) => array is ArrayLike<U>;\nexport function allFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => boolean;\nexport function allFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => boolean {\n return array => all(array, predicate);\n}\n\nexport function concat<T>(arrays: ArrayLike<ArrayLike<T>>): T[] {\n return nativeConcat.apply([], map(arrays, coerce)) as T[];\n}\n\nexport function prepend<T>(a: ArrayLike<T>): (b: ArrayLike<T>) => T[] {\n return b => concat([a, b]);\n}\n\nexport function append<T>(b: ArrayLike<T>): (a: ArrayLike<T>) => T[] {\n return a => concat([a, b]);\n}\n\nexport function concatMap<T, U>(\n array: ArrayLike<T>,\n f: (element: T, index: number) => ArrayLike<U>\n): U[] {\n return concat(map(array, f));\n}\n\nexport function concatMapFn<T, U>(\n f: (element: T, index: number) => ArrayLike<U>\n): (array: ArrayLike<T>) => U[] {\n return array => concatMap(array, f);\n}\n\nexport type NoneNull<T extends ArrayLike<unknown>> = {[K in keyof T]: NonNullable<T[K]>};\n\nexport function noneNull<T extends ArrayLike<unknown>>(array: T): NoneNull<T> | null {\n return any(array, isNull) ? null : (array as NoneNull<T>);\n}\n\nexport function scan<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U[] {\n const result: U[] = copy({length: array.length});\n let accumulator = initial;\n\n for (let i = 0; i < array.length; ++i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scanFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U[] {\n return array => scan(array, f, initial);\n}\n\nexport function scan1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n let accumulator = array[0] as T;\n const result: T[] = copy({0: accumulator, length: array.length});\n\n for (let i = 1; i < array.length; ++i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scan1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T[] {\n return array => scan1(array, f);\n}\n\nexport function scanRight<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U[] {\n const result: U[] = copy({length: array.length});\n let accumulator = initial;\n\n for (let i = array.length - 1; i >= 0; --i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scanRightFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U[] {\n return array => scanRight(array, f, initial);\n}\n\nexport function scanRight1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n let accumulator = array[array.length - 1] as T;\n const result: T[] = copy({[array.length - 1]: accumulator, length: array.length});\n\n for (let i = array.length - 2; i >= 0; --i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scanRight1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T[] {\n return array => scanRight1(array, f);\n}\n\n/** Splits the array at the specified index.\n *\n * Returns a tuple where the first element is the first `index` elements of the\n * array, and the second element is the remaining elements of the array. */\nexport function split<T>(array: readonly T[], index: number): [T[], T[]] {\n return [take(array, index), drop(array, index)];\n}\n\n/** Returns a function that splits an array at the specified index.\n *\n * This is the curried form of {@link split}. */\nexport function splitFn<T>(index: number): (array: readonly T[]) => [T[], T[]] {\n return array => split(array, index);\n}\n\nexport function partition<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T) => element is U\n): [U[], Array<Exclude<T, U>>];\nexport function partition<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]];\nexport function partition<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]] {\n const a: T[] = [];\n const b: T[] = [];\n\n for (let i = 0; i < array.length; ++i) {\n if (predicate(array[i] as T, i)) {\n a.push(array[i] as T);\n } else {\n b.push(array[i] as T);\n }\n }\n\n return [a, b];\n}\n\nexport function partitionFn<T, U extends T>(\n predicate: (element: T) => element is U\n): (array: ArrayLike<T>) => [U[], Array<Exclude<T, U>>];\nexport function partitionFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => [T[], T[]];\nexport function partitionFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => [T[], T[]] {\n return array => partition(array, predicate);\n}\n\nexport function partitionWhile<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T) => element is U\n): [U[], T[]];\nexport function partitionWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]];\nexport function partitionWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]] {\n let i;\n for (i = 0; i < array.length; ++i) {\n if (!predicate(array[i] as T, i)) {\n break;\n }\n }\n\n return [take(array, i), drop(array, i)];\n}\n\nexport function partitionWhileFn<T, U extends T>(\n predicate: (element: T) => element is U\n): (array: readonly T[]) => [U[], T[]];\nexport function partitionWhileFn<T>(\n predicate: (element: T) => boolean\n): (array: readonly T[]) => [T[], T[]];\nexport function partitionWhileFn<T>(\n predicate: (element: T) => boolean\n): (array: readonly T[]) => [T[], T[]] {\n return array => partitionWhile(array, predicate);\n}\n\nexport function partitionUntil<T>(\n array: ArrayLike<T>,\n predicate: (element: T) => boolean\n): [T[], T[]] {\n return partitionWhile(array, element => !predicate(element));\n}\n\nexport function partitionUntilFn<T>(\n predicate: (element: T) => boolean\n): (array: ArrayLike<T>) => [T[], T[]] {\n return array => partitionUntil(array, predicate);\n}\n\n/** Takes two arrays and returns an array of corresponding pairs.\n *\n * If one of the supplied arrays is shorter than the other, then the excess\n * elements of the longer array will be discarded. */\nexport function zip<T, U>(a: readonly T[], b: readonly U[]): Array<[T, U]> {\n const length = Math.min(a.length, b.length);\n const result = new Array<[T, U]>(length);\n for (let i = 0; i < length; ++i) {\n result[i] = [a[i] as T, b[i] as U];\n }\n return result;\n}\n\n/** Returns a function that combines the elements of `a` with the elements of\n * `b` and returns an array of corresponding pairs.\n *\n * If one of the supplied arrays is shorter than the other, then the excess\n * elements of the longer array will be discarded.\n *\n * This is the curried variant of {@link zip}. */\nexport function zipFn<T, U>(b: readonly U[]): (a: readonly T[]) => Array<[T, U]> {\n return a => zip(a, b);\n}\n\nexport function keyBy<TKey, TElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => TKey\n): Map<TKey, TElement[]> {\n const result = new Map<TKey, TElement[]>();\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as TElement;\n const key = f(element, i);\n const group = result.get(key) ?? [];\n if (!result.has(key)) {\n result.set(key, group);\n }\n group.push(element);\n }\n\n return result;\n}\n\nexport function keyByFn<TKey, TElement>(\n f: (element: TElement, index: number) => TKey\n): (array: ArrayLike<TElement>) => Map<TKey, TElement[]> {\n return array => keyBy(array, f);\n}\n\nexport function keyFirstBy<TKey, TElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => TKey\n): Map<TKey, TElement> {\n const result = new Map<TKey, TElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as TElement;\n const key = f(element, i);\n if (!result.has(key)) {\n result.set(key, element);\n }\n }\n\n return result;\n}\n\nexport function keyFirstByFn<TKey, TElement>(\n f: (element: TElement, index: number) => TKey\n): (array: ArrayLike<TElement>) => Map<TKey, TElement> {\n return array => keyFirstBy(array, f);\n}\n\nexport function keyLastBy<TKey, TElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => TKey\n): Map<TKey, TElement> {\n const result = new Map<TKey, TElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as TElement;\n const key = f(element, i);\n result.set(key, element);\n }\n\n return result;\n}\n\nexport function keyLastByFn<TKey, TElement>(\n f: (element: TElement, index: number) => TKey\n): (array: ArrayLike<TElement>) => Map<TKey, TElement> {\n return array => keyLastBy(array, f);\n}\n\nexport function mapKeyBy<TKey, TElement, TNewElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): Map<TKey, TNewElement[]> {\n const result = new Map<TKey, TNewElement[]>();\n\n for (let i = 0; i < array.length; ++i) {\n const [key, element] = f(array[i] as TElement, i);\n const group = result.get(key) ?? [];\n if (!result.has(key)) {\n result.set(key, group);\n }\n group.push(element);\n }\n\n return result;\n}\n\nexport function mapKeyByFn<TKey, TElement, TNewElement>(\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): (array: ArrayLike<TElement>) => Map<TKey, TNewElement[]> {\n return array => mapKeyBy(array, f);\n}\n\nexport function mapKeyFirstBy<TKey, TElement, TNewElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): Map<TKey, TNewElement> {\n const result = new Map<TKey, TNewElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const [key, element] = f(array[i] as TElement, i);\n if (!result.has(key)) {\n result.set(key, element);\n }\n }\n\n return result;\n}\n\nexport function mapKeyFirstByFn<TKey, TElement, TNewElement>(\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): (array: ArrayLike<TElement>) => Map<TKey, TNewElement> {\n return array => mapKeyFirstBy(array, f);\n}\n\nexport function mapKeyLastBy<TKey, TElement, TNewElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): Map<TKey, TNewElement> {\n const result = new Map<TKey, TNewElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const [key, element] = f(array[i] as TElement, i);\n result.set(key, element);\n }\n\n return result;\n}\n\nexport function mapKeyLastByFn<TKey, TElement, TNewElement>(\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): (array: ArrayLike<TElement>) => Map<TKey, TNewElement> {\n return array => mapKeyLastBy(array, f);\n}\n\nexport interface IdentityGrouping<T> {\n readonly identity: (element: T) => unknown;\n}\n\nexport interface EqualityGrouping<T> {\n readonly equal: (a: T, b: T) => boolean;\n readonly hash?: (element: T, index: number) => unknown;\n}\n\nexport interface OrderedGrouping<T> {\n readonly compare: Comparator<T>;\n readonly hash?: (element: T, index: number) => unknown;\n}\n\nexport interface HashGrouping<T> {\n readonly hash: (element: T, index: number) => unknown;\n}\n\nexport type Grouping<T> =\n | IdentityGrouping<T>\n | EqualityGrouping<T>\n | OrderedGrouping<T>\n | HashGrouping<T>;\n\nexport function group<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[][] {\n if (\"identity\" in grouping) {\n return groupByIdentity(array, grouping.identity);\n } else if (\"compare\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return groupByOrderWithHash(array, grouping.compare, grouping.hash);\n } else {\n return groupByOrder(array, grouping.compare);\n }\n } else if (\"equal\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return groupByEqualityWithHash(array, grouping.equal, grouping.hash);\n } else {\n return groupByEquality(array, grouping.equal);\n }\n } else {\n return groupByHash(array, grouping.hash);\n }\n}\n\nexport function groupFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[][] {\n return array => group(array, grouping);\n}\n\nexport function groupByIdentity<T>(\n array: ArrayLike<T>,\n identity: (element: T) => unknown = element => element\n): T[][] {\n const groups: T[][] = [];\n const map = new Map<unknown, T[]>();\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const key = identity(element);\n const group = map.get(key) ?? [];\n group.push(element);\n if (!map.has(key)) {\n groups.push(group);\n map.set(key, group);\n }\n }\n return groups;\n}\n\nexport function groupByIdentityFn<T>(\n identity: (element: T) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByIdentity(array, identity);\n}\n\nexport function groupByEquality<T>(array: ArrayLike<T>, equal: (a: T, b: T) => boolean): T[][] {\n const result: T[][] = [];\n\n outer: for (let i = 0; i < array.length; ++i) {\n for (let j = 0; j < result.length; ++j) {\n const group = notNull(result[j]);\n if (equal(group[0] as T, array[i] as T)) {\n group.push(array[i] as T);\n continue outer;\n }\n }\n\n result.push([array[i] as T]);\n }\n\n return result;\n}\n\nexport function groupByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByEquality(array, equal);\n}\n\nexport function groupByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[][] {\n // TODO: This could use a binary tree to be way more efficient\n return groupByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function groupByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[][] {\n return array => groupByOrder(array, compare);\n}\n\nexport function groupByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[][] {\n const groups = new Map<unknown, T[]>();\n const result: T[][] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n\n const group = groups.get(h) ?? [];\n if (!groups.has(h)) {\n result.push(group);\n groups.set(h, group);\n }\n group.push(element);\n }\n\n return result;\n}\n\nexport function groupByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByHash(array, hash);\n}\n\nexport function groupByEqualityWithHash<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): T[][] {\n const groups = new Map<unknown, T[][]>();\n const result: T[][] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n\n const hashGroup = groups.get(h) ?? [];\n if (!groups.has(h)) {\n groups.set(h, hashGroup);\n }\n const group = find(hashGroup, group => equal(group[0] as T, element));\n if (group == null) {\n const newGroup = [element];\n hashGroup.push(newGroup);\n result.push(newGroup);\n } else {\n group.push(element);\n }\n }\n\n return result;\n}\n\nexport function groupByEqualityWithHashFn<T>(\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByEqualityWithHash(array, equal, hash);\n}\n\nexport function groupByOrderWithHash<T>(\n array: ArrayLike<T>,\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): T[][] {\n return groupByEqualityWithHash(array, (a, b) => compare(a, b) === Comparison.equal, hash);\n}\n\nexport function groupByOrderWithHashFn<T>(\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByOrderWithHash(array, compare, hash);\n}\n\nexport function groupAdjacent<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[][] {\n if (\"identity\" in grouping) {\n return groupAdjacentByIdentity(array, grouping.identity);\n } else if (\"equal\" in grouping) {\n return groupAdjacentByEquality(array, grouping.equal);\n } else if (\"compare\" in grouping) {\n return groupAdjacentByOrder(array, grouping.compare);\n } else {\n return groupByHash(array, grouping.hash);\n }\n}\n\nexport function groupAdjacentFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacent(array, grouping);\n}\n\nexport function groupAdjacentByIdentity<T>(\n array: ArrayLike<T>,\n identity?: (element: T) => unknown\n): T[][] {\n return identity == null\n ? groupAdjacentByEquality(array, (a, b) => a === b)\n : groupAdjacentByEquality(array, (a, b) => identity(a) === identity(b));\n}\n\nexport function groupAdjacentByIdentityFn<T>(\n identity: (element: T) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByEquality(array, (a, b) => identity(a) === identity(b));\n}\n\nexport function groupAdjacentByEquality<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean\n): T[][] {\n if (array.length === 0) {\n return [];\n }\n\n let element = array[0] as T;\n let group: T[] = [element];\n const result: T[][] = [group];\n\n for (let i = 1; i < array.length; ++i) {\n const prev = element;\n element = array[i] as T;\n if (equal(prev, element)) {\n group.push(element);\n } else {\n group = [element];\n result.push(group);\n }\n }\n\n return result;\n}\n\nexport function groupAdjacentByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByEquality(array, equal);\n}\n\nexport function groupAdjacentByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[][] {\n return groupAdjacentByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function groupAdjacentByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByOrder(array, compare);\n}\n\nexport function groupAdjacentByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[][] {\n if (array.length === 0) {\n return [];\n }\n\n const element = array[0] as T;\n let h = hash(element, 0);\n let group: T[] = [element];\n const result: T[][] = [group];\n\n for (let i = 1; i < array.length; ++i) {\n const element = array[i] as T;\n const h1 = hash(element, i);\n if (h === h1) {\n group.push(element);\n } else {\n h = h1;\n group = [element];\n result.push(group);\n }\n }\n\n return result;\n}\n\nexport function groupAdjacentByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByHash(array, hash);\n}\n\nexport function unique<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[] {\n if (\"identity\" in grouping) {\n return uniqueByIdentityInternal(array, grouping.identity);\n } else if (\"compare\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return uniqueByOrderWithHash(array, grouping.compare, grouping.hash);\n } else {\n return uniqueByOrder(array, grouping.compare);\n }\n } else if (\"equal\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return uniqueByEqualityWithHash(array, grouping.equal, grouping.hash);\n } else {\n return uniqueByEquality(array, grouping.equal);\n }\n } else {\n return uniqueByHash(array, grouping.hash);\n }\n}\n\nexport function uniqueFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[] {\n return array => unique(array, grouping);\n}\n\nexport function uniqueByIdentity<T>(array: ArrayLike<T>, identity?: (element: T) => unknown): T[] {\n return uniqueByIdentityInternal(array, identity ?? (element => element));\n}\n\nfunction uniqueByIdentityInternal<T>(array: ArrayLike<T>, identity: (element: T) => unknown): T[] {\n const set = new Set<unknown>();\n const result: T[] = [];\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n if (!set.has(identity(element))) {\n set.add(identity(element));\n result.push(element);\n }\n }\n return result;\n}\n\nexport function uniqueByEquality<T>(array: ArrayLike<T>, equal: (a: T, b: T) => boolean): T[] {\n const result: T[] = [];\n\n outer: for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n for (let j = 0; j < result.length; ++j) {\n if (equal(element, result[j] as T)) {\n continue outer;\n }\n }\n result.push(element);\n }\n\n return result;\n}\n\nexport function uniqueByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByEquality(array, equal);\n}\n\nexport function uniqueByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[] {\n return uniqueByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function uniqueByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[] {\n // TODO: This could use a binary tree to be more efficient\n return array => uniqueByOrder(array, compare);\n}\n\nexport function uniqueByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[] {\n const seen = new Set<unknown>();\n const result: T[] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n if (!seen.has(h)) {\n seen.add(h);\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByHash(array, hash);\n}\n\nexport function uniqueByEqualityWithHash<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): T[] {\n const seenGroups = new Map<unknown, T[]>();\n const result: T[] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n\n const seenGroup = seenGroups.get(h) ?? [];\n\n if (!seenGroups.has(h)) {\n seenGroups.set(h, seenGroup);\n }\n\n if (all(seenGroup, seenElement => !equal(seenElement, element))) {\n seenGroup.push(element);\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueByEqualityWithHashFn<T>(\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByEqualityWithHash(array, equal, hash);\n}\n\nexport function uniqueByOrderWithHash<T>(\n array: ArrayLike<T>,\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): T[] {\n return uniqueByEqualityWithHash(array, (a, b) => compare(a, b) === Comparison.equal, hash);\n}\n\nexport function uniqueByOrderWithHashFn<T>(\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByOrderWithHash(array, compare, hash);\n}\n\nexport function uniqueAdjacent<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[] {\n if (\"identity\" in grouping) {\n return uniqueAdjacentByIdentity(array, grouping.identity);\n } else if (\"equal\" in grouping) {\n return uniqueAdjacentByEquality(array, grouping.equal);\n } else if (\"compare\" in grouping) {\n return uniqueAdjacentByOrder(array, grouping.compare);\n } else {\n return uniqueAdjacentByHash(array, grouping.hash);\n }\n}\n\nexport function uniqueAdjacentFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacent(array, grouping);\n}\n\nexport function uniqueAdjacentByIdentity<T>(\n array: ArrayLike<T>,\n identity?: (element: T) => unknown\n): T[] {\n return identity == null\n ? uniqueAdjacentByEquality(array, (a, b) => a === b)\n : uniqueAdjacentByEquality(array, (a, b) => identity(a) === identity(b));\n}\n\nexport function uniqueAdjacentByIdentityFn<T>(\n identity: (element: T) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByIdentity(array, identity);\n}\n\nexport function uniqueAdjacentByEquality<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n let element = array[0] as T;\n const result = [element];\n\n for (let i = 1; i < array.length; ++i) {\n const prev = element;\n element = array[i] as T;\n if (!equal(prev, element)) {\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueAdjacentByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByEquality(array, equal);\n}\n\nexport function uniqueAdjacentByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[] {\n return uniqueAdjacentByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function uniqueAdjacentByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByOrder(array, compare);\n}\n\nexport function uniqueAdjacentByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n const element = array[0] as T;\n let h = hash(element, 0);\n const result = [element];\n\n for (let i = 1; i < array.length; ++i) {\n const element = array[i] as T;\n const h1 = hash(element, i);\n if (h !== h1) {\n h = h1;\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueAdjacentByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByHash(array, hash);\n}\n\n/** @deprecated Use [array-shuffle](https://npmjs.com/array-shuffle) instead. */\nexport function shuffle<T>(array: ArrayLike<T>): T[] {\n const result = copy(array);\n for (let i = 0; i < array.length; ++i) {\n const j = i + Math.floor(Math.random() * (array.length - i));\n const replacement = result[j] as T;\n result[j] = result[i] as T;\n result[i] = replacement;\n }\n return result;\n}\n\nexport function sort(array: ArrayLike<boolean>): boolean[];\nexport function sort(array: ArrayLike<number>): number[];\nexport function sort(array: ArrayLike<string>): string[];\nexport function sort<T>(array: ArrayLike<T>, comparator: Comparator<T>): T[];\nexport function sort<T>(array: ArrayLike<T>, comparator?: Comparator<T>): T[] {\n return copy(array).sort(comparator ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nexport function sortFn<T>(comparator: Comparator<T>): (array: ArrayLike<T>) => T[] {\n return array => sort(array, comparator);\n}\n\nexport function sortBy<T>(array: ArrayLike<T>, select: SortSelect<T>): T[] {\n return sort(array, (a, b) =>\n (defaultCompare as Comparator<string | number | boolean>)(select(a), select(b))\n );\n}\n\nexport function sortByFn<T>(select: SortSelect<T>): (array: ArrayLike<T>) => T[] {\n return array => sortBy(array, select);\n}\n\nexport function sortByDescending<T>(array: ArrayLike<T>, select: SortSelect<T>): T[] {\n return sort(\n array,\n (a, b) => -(defaultCompare as Comparator<string | number | boolean>)(select(a), select(b))\n );\n}\n\nexport function sortByDescendingFn<T>(select: SortSelect<T>): (array: ArrayLike<T>) => T[] {\n return array => sortByDescending(array, select);\n}\n\nexport type SortSelect<T> =\n | ((element: T) => boolean)\n | ((element: T) => number)\n | ((element: T) => string);\n\nexport function forEach<T>(\n array: ArrayLike<T>,\n f: (element: T, index: number) => void\n): typeof array {\n for (let i = 0; i < array.length; ++i) {\n f(array[i] as T, i);\n }\n return array;\n}\n\nexport function forEachFn<T>(\n f: (element: T, index: number) => void\n): (array: ArrayLike<T>) => typeof array {\n return array => forEach(array, f);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import {isNotNull, isNull, notNull} from \"@softwareventures/nullable\";\nimport type {Comparator} from \"@softwareventures/ordered\";\nimport {\n compare as defaultCompare,\n Comparison,\n equal as defaultEqual\n} from \"@softwareventures/ordered\";\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeSlice = Array.prototype.slice;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeReverse = Array.prototype.reverse;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeConcat = Array.prototype.concat;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeFilter = Array.prototype.filter;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeReduce = Array.prototype.reduce;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeReduceRight = Array.prototype.reduceRight;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeIndexOf = Array.prototype.indexOf;\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst nativeFindIndex = Array.prototype.findIndex;\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\nexport function copy<T>(array: ArrayLike<T>): T[];\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const copy: <T>(array: ArrayLike<T>) => T[] = Array.from;\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport function isArray<T = unknown>(value: readonly T[] | unknown): value is readonly T[];\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const isArray: (value: unknown) => value is unknown[] = Array.isArray;\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport function isArrayLike<T>(value: ArrayLike<T> | unknown): value is ArrayLike<T> {\n return (\n typeof value === \"object\" &&\n value != null &&\n \"length\" in value &&\n typeof (value as {length: unknown}).length === \"number\"\n );\n}\n\nexport function coerce<T>(array: ArrayLike<T>): readonly T[] {\n return isArray(array) ? (array as readonly T[]) : copy(array);\n}\n\nexport function first<T>(array: ArrayLike<T>): T | null {\n return array.length === 0 ? null : (array[0] as T);\n}\n\n/** @deprecated Use {@link first} instead. */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\nexport function head<T>(array: ArrayLike<T>): T | null;\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const head = first;\n\nexport function tail<T>(array: ArrayLike<T>): T[] {\n return nativeSlice.call(array, 1) as T[];\n}\n\nexport function push<T>(array: ArrayLike<T>, value: T): T[] {\n return [...coerce(array), value];\n}\n\nexport function pushFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => push(array, value);\n}\n\nexport function unshift<T>(array: ArrayLike<T>, value: T): T[] {\n return [value, ...coerce(array)];\n}\n\nexport function unshiftFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => unshift(array, value);\n}\n\nexport function initial<T>(array: ArrayLike<T>): T[] {\n return array.length === 0 ? [] : (nativeSlice.call(array, 0, array.length - 1) as T[]);\n}\n\nexport function last<T>(array: ArrayLike<T>): T | null {\n return array.length === 0 ? null : (array[array.length - 1] as T);\n}\n\n/** If the array contains exactly one element, returns that element.\n * Otherwise, returns null. */\nexport function only<T>(array: ArrayLike<T>): T | null {\n return array.length === 1 ? (array[0] as T) : null;\n}\n\nexport function empty<T>(array: ArrayLike<T>): boolean {\n return array.length === 0;\n}\n\nexport function notEmpty<T>(array: ArrayLike<T>): boolean {\n return array.length > 0;\n}\n\nexport function reverse<T>(array: ArrayLike<T>): T[] {\n return nativeReverse.call(copy(array)) as T[];\n}\n\nexport function slice<T>(array: ArrayLike<T>, start?: number, end?: number): T[] {\n return nativeSlice.call(array, start, end) as T[];\n}\n\nexport function sliceFn<T>(start?: number, end?: number): (array: ArrayLike<T>) => T[] {\n return array => nativeSlice.call(array, start, end) as T[];\n}\n\nexport function take<T>(array: ArrayLike<T>, count: number): T[] {\n return nativeSlice.call(array, 0, count) as T[];\n}\n\nexport function takeFn<T>(count: number): (array: ArrayLike<T>) => T[] {\n return array => nativeSlice.call(array, 0, count) as T[];\n}\n\nexport function drop<T>(array: ArrayLike<T>, count: number): T[] {\n return nativeSlice.call(array, count) as T[];\n}\n\nexport function dropFn<T>(count: number): (array: ArrayLike<T>) => T[] {\n return array => nativeSlice.call(array, count) as T[];\n}\n\nexport function takeWhile<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => element is U\n): U[];\nexport function takeWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[];\nexport function takeWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n let i = 0;\n while (i < array.length && predicate(array[i] as T, i)) {\n ++i;\n }\n return take(array, i);\n}\n\nexport function takeWhileFn<T, U extends T>(\n predicate: (element: T, index: number) => element is U\n): (array: ArrayLike<T>) => U[];\nexport function takeWhileFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[];\nexport function takeWhileFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => takeWhile(array, predicate);\n}\n\nexport function takeUntil<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return takeWhile(array, (element, index) => !predicate(element, index));\n}\n\nexport function takeUntilFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => takeUntil(array, predicate);\n}\n\nexport function dropWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n let i = 0;\n while (i < array.length && predicate(array[i] as T, i)) {\n ++i;\n }\n return drop(array, i);\n}\n\nexport function dropWhileFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => dropWhile(array, predicate);\n}\n\nexport function dropUntil<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return dropWhile(array, (element, index) => !predicate(element, index));\n}\n\nexport function dropUntilFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => dropWhile(array, predicate);\n}\n\nexport function equal<T>(\n a: ArrayLike<T>,\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; ++i) {\n if (!elementsEqual(a[i] as T, b[i] as T)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function equalFn<T>(\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): (a: ArrayLike<T>) => boolean {\n return a => equal(a, b, elementsEqual);\n}\n\nexport function notEqual<T>(\n a: ArrayLike<T>,\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): boolean {\n return !equal(a, b, elementsEqual);\n}\n\nexport function notEqualFn<T>(\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): (a: ArrayLike<T>) => boolean {\n return a => notEqual(a, b, elementsEqual);\n}\n\nexport function prefixMatch<T>(\n a: ArrayLike<T>,\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): boolean {\n if (a.length < b.length) {\n return false;\n }\n\n for (let i = 0; i < b.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function prefixMatchFn<T>(\n b: ArrayLike<T>,\n elementsEqual: (a: T, b: T) => boolean = defaultEqual\n): (a: ArrayLike<T>) => boolean {\n return a => prefixMatch(a, b, elementsEqual);\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the exported declaration, the implementation is below.\nexport function map<T, U>(array: ArrayLike<T>, f: (element: T, index: number) => U): U[];\n\n/** @internal This implementation is for internal use only, the exported declaration is above */\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore duplicate identifier: This is the actual implementation, the exported declaration is above.\nexport const map: <T, U>(array: ArrayLike<T>, f: (element: T, index: number) => U) => U[] =\n Array.from;\n\nexport function mapFn<T, U>(f: (element: T, index: number) => U): (array: ArrayLike<T>) => U[] {\n return array => Array.from(array, f);\n}\n\nexport function filter<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => element is U\n): U[];\nexport function filter<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[];\nexport function filter<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return nativeFilter.call(array, predicate) as T[];\n}\n\nexport function filterFn<T, U extends T>(\n predicate: (element: T, index: number) => element is U\n): (array: ArrayLike<T>) => U[];\nexport function filterFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[];\nexport function filterFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => nativeFilter.call(array, predicate) as T[];\n}\n\n/** @deprecated This function is confusing, use {@link excludeFirst} instead,\n * and invert the predicate. */\nexport function filterFirst<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n const result: T[] = [];\n let i = 0;\n for (; i < array.length; ++i) {\n const element = array[i] as T;\n if (predicate(element, i)) {\n result.push(element);\n } else {\n break;\n }\n }\n for (++i; i < array.length; ++i) {\n result.push(array[i] as T);\n }\n return result;\n}\n\n/** @deprecated This function is confusing, use {@link excludeFirstFn} instead,\n * and invert the predicate. */\nexport function filterFirstFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => filterFirst(array, predicate);\n}\n\nexport function exclude<T, U>(\n array: ArrayLike<T | U>,\n predicate: (element: T | U) => element is T\n): U[];\nexport function exclude<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[];\nexport function exclude<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return filter(array, (element, index) => !predicate(element, index));\n}\n\nexport function excludeFn<T, U>(\n predicate: (element: T | U) => element is T\n): (array: ArrayLike<T | U>) => T[];\nexport function excludeFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[];\nexport function excludeFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => exclude(array, predicate);\n}\n\nexport function excludeNull<T>(array: ArrayLike<T | null | undefined>): T[] {\n return filter(array, isNotNull);\n}\n\nexport function excludeFirst<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T[] {\n return filterFirst(array, (element, index) => !predicate(element, index));\n}\n\nexport function excludeFirstFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => excludeFirst(array, predicate);\n}\n\nexport function remove<T>(array: ArrayLike<T>, value: T): T[] {\n return exclude(array, element => element === value);\n}\n\nexport function removeFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => remove(array, value);\n}\n\nexport function removeFirst<T>(array: ArrayLike<T>, value: T): T[] {\n return excludeFirst(array, element => element === value);\n}\n\nexport function removeFirstFn<T>(value: T): (array: ArrayLike<T>) => T[] {\n return array => removeFirst(array, value);\n}\n\nexport function fold<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U {\n return (\n nativeReduce as (f: (accumulator: U, element: T, index: number) => U, initial: U) => U\n ).call(array, f, initial);\n}\n\nexport function foldFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array =>\n (\n nativeReduce as (f: (accumulator: U, element: T, index: number) => U, initial: U) => U\n ).call(array, f, initial);\n}\n\nexport function fold1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T {\n return (nativeReduce as (f: (accumulator: T, element: T, index: number) => T) => T).call(\n array,\n f\n );\n}\n\nexport function fold1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T {\n return array => fold1(array, f);\n}\n\nexport function foldRight<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U {\n return (\n nativeReduceRight as (f: (accumulator: U, element: T, index: number) => U, initial: U) => U\n ).call(array, f, initial);\n}\n\nexport function foldRightFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array =>\n (\n nativeReduceRight as (\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n ) => U\n ).call(array, f, initial);\n}\n\nexport function foldRight1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T {\n return (nativeReduceRight as (f: (accumulator: T, element: T, index: number) => T) => T).call(\n array,\n f\n );\n}\n\nexport function foldRight1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T {\n return array => foldRight1(array, f);\n}\n\nexport function foldMap<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): U {\n let accumulator = initial;\n for (let i = 0; i < array.length; ++i) {\n accumulator = f(accumulator, m(array[i] as T, i), i);\n }\n\n return accumulator;\n}\n\nexport function foldMapFn<T, U>(\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array => foldMap(array, f, m, initial);\n}\n\nexport function foldMapRight<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): U {\n let accumulator = initial;\n const length = array.length;\n for (let i = 0; i < array.length; ++i) {\n accumulator = f(accumulator, m(array[length - i] as T, i), i);\n }\n\n return accumulator;\n}\n\nexport function foldMapRightFn<T, U>(\n f: (accumulator: U, element: U, index: number) => U,\n m: (element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U {\n return array => foldMapRight(array, f, m, initial);\n}\n\nexport function contains<T>(array: ArrayLike<T>, value: T): boolean {\n return nativeIndexOf.call(array, value) !== -1;\n}\n\nexport function containsFn<T>(value: T): (array: ArrayLike<T>) => boolean {\n return array => nativeIndexOf.call(array, value) !== -1;\n}\n\nexport function indexOf<T>(array: ArrayLike<T>, value: T): number | null {\n const index = nativeIndexOf.call(array, value);\n return index === -1 ? null : index;\n}\n\nexport function indexOfFn<T>(value: T): (array: ArrayLike<T>) => number | null {\n return array => indexOf(array, value);\n}\n\nexport function lastIndexOf<T>(array: ArrayLike<T>, value: T): number | null {\n for (let i = array.length - 1; i >= 0; --i) {\n if ((array[i] as T) === value) {\n return i;\n }\n }\n return null;\n}\n\nexport function lastIndexOfFn<T>(value: T): (array: ArrayLike<T>) => number | null {\n return array => lastIndexOf(array, value);\n}\n\nexport function findIndex<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): number | null {\n const index = nativeFindIndex.call(array, predicate);\n return index === -1 ? null : index;\n}\n\nexport function findIndexFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => number | null {\n return array => findIndex(array, predicate);\n}\n\nexport function findLastIndex<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): number | null {\n for (let i = array.length - 1; i >= 0; --i) {\n if (predicate(array[i] as T, i)) {\n return i;\n }\n }\n return null;\n}\n\nexport function findLastIndexFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => number | null {\n return array => findLastIndex(array, predicate);\n}\n\nexport function find<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T) => element is U\n): U | null;\nexport function find<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T | null;\nexport function find<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T | null {\n const index = findIndex(array, predicate);\n return index == null ? null : (array[index] as T);\n}\n\nexport function findFn<T, U extends T>(\n predicate: (element: T) => element is U\n): (array: ArrayLike<T>) => U | null;\nexport function findFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T | null;\nexport function findFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T | null {\n return array => find(array, predicate);\n}\n\nexport function findLast<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T) => element is U\n): U | null;\nexport function findLast<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T | null;\nexport function findLast<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): T | null {\n for (let i = array.length - 1; i >= 0; --i) {\n const element = array[i] as T;\n if (predicate(element, i)) {\n return element;\n }\n }\n return null;\n}\n\nexport function findLastFn<T, U extends T>(\n predicate: (element: T) => element is U\n): (array: ArrayLike<T>) => U | null;\nexport function findLastFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T | null;\nexport function findLastFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => T | null {\n return array => findLast(array, predicate);\n}\n\nexport function maximum<T extends string | number | boolean>(array: ArrayLike<T>): T | null;\nexport function maximum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null;\nexport function maximum<T>(array: ArrayLike<T>, compare?: Comparator<T>): T | null {\n return internalMaximum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nexport function maximumFn<T extends string | number | boolean>(): (array: ArrayLike<T>) => T | null;\nexport function maximumFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T | null;\nexport function maximumFn<T>(compare?: Comparator<T>): (array: ArrayLike<T>) => T | null {\n return array => internalMaximum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nfunction internalMaximum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null {\n if (array.length === 0) {\n return null;\n }\n\n let result = array[0] as T;\n\n for (let i = 1; i < array.length; ++i) {\n if (compare(array[i] as T, result) > Comparison.equal) {\n result = array[i] as T;\n }\n }\n\n return result;\n}\n\nexport function maximumBy<T>(array: ArrayLike<T>, select: (element: T) => number): T | null {\n return maximum(array, (a, b) => defaultCompare(select(a), select(b)));\n}\n\nexport function maximumByFn<T>(select: (element: T) => number): (array: ArrayLike<T>) => T | null {\n return array => maximumBy(array, select);\n}\n\nexport function minimum<T extends string | number | boolean>(array: ArrayLike<T>): T | null;\nexport function minimum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null;\nexport function minimum<T>(array: ArrayLike<T>, compare?: Comparator<T>): T | null {\n return internalMinimum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nexport function minimumFn<T extends string | number | boolean>(): (array: ArrayLike<T>) => T | null;\nexport function minimumFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T | null;\nexport function minimumFn<T>(compare?: Comparator<T>): (array: ArrayLike<T>) => T | null {\n return array => internalMinimum(array, compare ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nfunction internalMinimum<T>(array: ArrayLike<T>, compare: Comparator<T>): T | null {\n if (array.length === 0) {\n return null;\n }\n\n let result = array[0] as T;\n\n for (let i = 1; i < array.length; ++i) {\n if (compare(array[i] as T, result) < Comparison.equal) {\n result = array[i] as T;\n }\n }\n\n return result;\n}\n\nexport function minimumBy<T>(array: ArrayLike<T>, select: (element: T) => number): T | null {\n return minimum(array, (a, b) => defaultCompare(select(a), select(b)));\n}\n\nexport function minimumByFn<T>(select: (element: T) => number): (array: ArrayLike<T>) => T | null {\n return array => minimumBy(array, select);\n}\n\nexport function sum(array: ArrayLike<number>): number {\n return fold(array, (a, b) => a + b, 0);\n}\n\nexport function product(array: ArrayLike<number>): number {\n return fold(array, (a, b) => a * b, 1);\n}\n\nexport function average(array: ArrayLike<number>): number | null {\n if (array.length === 0) {\n return null;\n } else {\n return sum(array) / array.length;\n }\n}\n\nexport function and(array: ArrayLike<boolean>): boolean {\n return findIndex(array, element => !element) == null;\n}\n\nexport function or(array: ArrayLike<boolean>): boolean {\n return findIndex(array, element => Boolean(element)) != null;\n}\n\nexport function any<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): boolean {\n return findIndex(array, predicate) != null;\n}\n\nexport function anyFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => boolean {\n return array => any(array, predicate);\n}\n\nexport function all<T, U extends T>(\n array: readonly T[],\n predicate: (element: T, index: number) => element is U\n): array is readonly U[];\nexport function all<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => element is U\n): array is ArrayLike<U>;\nexport function all<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): boolean;\nexport function all<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): boolean {\n return !any(array, (element, index) => !predicate(element, index));\n}\n\nexport function allFn<T, U extends T>(\n predicate: (element: T, index: number) => element is U\n): (array: ArrayLike<T>) => array is ArrayLike<U>;\nexport function allFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => boolean;\nexport function allFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => boolean {\n return array => all(array, predicate);\n}\n\nexport function concat<T>(arrays: ArrayLike<ArrayLike<T>>): T[] {\n return nativeConcat.apply([], map(arrays, coerce)) as T[];\n}\n\nexport function prepend<T>(a: ArrayLike<T>): (b: ArrayLike<T>) => T[] {\n return b => concat([a, b]);\n}\n\nexport function append<T>(b: ArrayLike<T>): (a: ArrayLike<T>) => T[] {\n return a => concat([a, b]);\n}\n\nexport function concatMap<T, U>(\n array: ArrayLike<T>,\n f: (element: T, index: number) => ArrayLike<U>\n): U[] {\n return concat(map(array, f));\n}\n\nexport function concatMapFn<T, U>(\n f: (element: T, index: number) => ArrayLike<U>\n): (array: ArrayLike<T>) => U[] {\n return array => concatMap(array, f);\n}\n\nexport type NoneNull<T extends ArrayLike<unknown>> = {[K in keyof T]: NonNullable<T[K]>};\n\nexport function noneNull<T extends ArrayLike<unknown>>(array: T): NoneNull<T> | null {\n return any(array, isNull) ? null : (array as NoneNull<T>);\n}\n\nexport function scan<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U[] {\n const result: U[] = copy({length: array.length});\n let accumulator = initial;\n\n for (let i = 0; i < array.length; ++i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scanFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U[] {\n return array => scan(array, f, initial);\n}\n\nexport function scan1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n let accumulator = array[0] as T;\n const result: T[] = copy({0: accumulator, length: array.length});\n\n for (let i = 1; i < array.length; ++i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scan1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T[] {\n return array => scan1(array, f);\n}\n\nexport function scanRight<T, U>(\n array: ArrayLike<T>,\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): U[] {\n const result: U[] = copy({length: array.length});\n let accumulator = initial;\n\n for (let i = array.length - 1; i >= 0; --i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scanRightFn<T, U>(\n f: (accumulator: U, element: T, index: number) => U,\n initial: U\n): (array: ArrayLike<T>) => U[] {\n return array => scanRight(array, f, initial);\n}\n\nexport function scanRight1<T>(\n array: ArrayLike<T>,\n f: (accumulator: T, element: T, index: number) => T\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n let accumulator = array[array.length - 1] as T;\n const result: T[] = copy({[array.length - 1]: accumulator, length: array.length});\n\n for (let i = array.length - 2; i >= 0; --i) {\n result[i] = accumulator = f(accumulator, array[i] as T, i);\n }\n\n return result;\n}\n\nexport function scanRight1Fn<T>(\n f: (accumulator: T, element: T, index: number) => T\n): (array: ArrayLike<T>) => T[] {\n return array => scanRight1(array, f);\n}\n\n/** Splits the array at the specified index.\n *\n * Returns a tuple where the first element is the first `index` elements of the\n * array, and the second element is the remaining elements of the array. */\nexport function split<T>(array: readonly T[], index: number): [T[], T[]] {\n return [take(array, index), drop(array, index)];\n}\n\n/** Returns a function that splits an array at the specified index.\n *\n * This is the curried form of {@link split}. */\nexport function splitFn<T>(index: number): (array: readonly T[]) => [T[], T[]] {\n return array => split(array, index);\n}\n\nexport function partition<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T) => element is U\n): [U[], Array<Exclude<T, U>>];\nexport function partition<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]];\nexport function partition<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]] {\n const a: T[] = [];\n const b: T[] = [];\n\n for (let i = 0; i < array.length; ++i) {\n if (predicate(array[i] as T, i)) {\n a.push(array[i] as T);\n } else {\n b.push(array[i] as T);\n }\n }\n\n return [a, b];\n}\n\nexport function partitionFn<T, U extends T>(\n predicate: (element: T) => element is U\n): (array: ArrayLike<T>) => [U[], Array<Exclude<T, U>>];\nexport function partitionFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => [T[], T[]];\nexport function partitionFn<T>(\n predicate: (element: T, index: number) => boolean\n): (array: ArrayLike<T>) => [T[], T[]] {\n return array => partition(array, predicate);\n}\n\nexport function partitionWhile<T, U extends T>(\n array: ArrayLike<T>,\n predicate: (element: T) => element is U\n): [U[], T[]];\nexport function partitionWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]];\nexport function partitionWhile<T>(\n array: ArrayLike<T>,\n predicate: (element: T, index: number) => boolean\n): [T[], T[]] {\n let i;\n for (i = 0; i < array.length; ++i) {\n if (!predicate(array[i] as T, i)) {\n break;\n }\n }\n\n return [take(array, i), drop(array, i)];\n}\n\nexport function partitionWhileFn<T, U extends T>(\n predicate: (element: T) => element is U\n): (array: readonly T[]) => [U[], T[]];\nexport function partitionWhileFn<T>(\n predicate: (element: T) => boolean\n): (array: readonly T[]) => [T[], T[]];\nexport function partitionWhileFn<T>(\n predicate: (element: T) => boolean\n): (array: readonly T[]) => [T[], T[]] {\n return array => partitionWhile(array, predicate);\n}\n\nexport function partitionUntil<T>(\n array: ArrayLike<T>,\n predicate: (element: T) => boolean\n): [T[], T[]] {\n return partitionWhile(array, element => !predicate(element));\n}\n\nexport function partitionUntilFn<T>(\n predicate: (element: T) => boolean\n): (array: ArrayLike<T>) => [T[], T[]] {\n return array => partitionUntil(array, predicate);\n}\n\n/** Takes two arrays and returns an array of corresponding pairs.\n *\n * If one of the supplied arrays is shorter than the other, then the excess\n * elements of the longer array will be discarded. */\nexport function zip<T, U>(a: readonly T[], b: readonly U[]): Array<[T, U]> {\n const length = Math.min(a.length, b.length);\n const result = new Array<[T, U]>(length);\n for (let i = 0; i < length; ++i) {\n result[i] = [a[i] as T, b[i] as U];\n }\n return result;\n}\n\n/** Returns a function that combines the elements of `a` with the elements of\n * `b` and returns an array of corresponding pairs.\n *\n * If one of the supplied arrays is shorter than the other, then the excess\n * elements of the longer array will be discarded.\n *\n * This is the curried variant of {@link zip}. */\nexport function zipFn<T, U>(b: readonly U[]): (a: readonly T[]) => Array<[T, U]> {\n return a => zip(a, b);\n}\n\nexport function keyBy<TKey, TElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => TKey\n): Map<TKey, TElement[]> {\n const result = new Map<TKey, TElement[]>();\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as TElement;\n const key = f(element, i);\n const group = result.get(key) ?? [];\n if (!result.has(key)) {\n result.set(key, group);\n }\n group.push(element);\n }\n\n return result;\n}\n\nexport function keyByFn<TKey, TElement>(\n f: (element: TElement, index: number) => TKey\n): (array: ArrayLike<TElement>) => Map<TKey, TElement[]> {\n return array => keyBy(array, f);\n}\n\nexport function keyFirstBy<TKey, TElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => TKey\n): Map<TKey, TElement> {\n const result = new Map<TKey, TElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as TElement;\n const key = f(element, i);\n if (!result.has(key)) {\n result.set(key, element);\n }\n }\n\n return result;\n}\n\nexport function keyFirstByFn<TKey, TElement>(\n f: (element: TElement, index: number) => TKey\n): (array: ArrayLike<TElement>) => Map<TKey, TElement> {\n return array => keyFirstBy(array, f);\n}\n\nexport function keyLastBy<TKey, TElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => TKey\n): Map<TKey, TElement> {\n const result = new Map<TKey, TElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as TElement;\n const key = f(element, i);\n result.set(key, element);\n }\n\n return result;\n}\n\nexport function keyLastByFn<TKey, TElement>(\n f: (element: TElement, index: number) => TKey\n): (array: ArrayLike<TElement>) => Map<TKey, TElement> {\n return array => keyLastBy(array, f);\n}\n\nexport function mapKeyBy<TKey, TElement, TNewElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): Map<TKey, TNewElement[]> {\n const result = new Map<TKey, TNewElement[]>();\n\n for (let i = 0; i < array.length; ++i) {\n const [key, element] = f(array[i] as TElement, i);\n const group = result.get(key) ?? [];\n if (!result.has(key)) {\n result.set(key, group);\n }\n group.push(element);\n }\n\n return result;\n}\n\nexport function mapKeyByFn<TKey, TElement, TNewElement>(\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): (array: ArrayLike<TElement>) => Map<TKey, TNewElement[]> {\n return array => mapKeyBy(array, f);\n}\n\nexport function mapKeyFirstBy<TKey, TElement, TNewElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): Map<TKey, TNewElement> {\n const result = new Map<TKey, TNewElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const [key, element] = f(array[i] as TElement, i);\n if (!result.has(key)) {\n result.set(key, element);\n }\n }\n\n return result;\n}\n\nexport function mapKeyFirstByFn<TKey, TElement, TNewElement>(\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): (array: ArrayLike<TElement>) => Map<TKey, TNewElement> {\n return array => mapKeyFirstBy(array, f);\n}\n\nexport function mapKeyLastBy<TKey, TElement, TNewElement>(\n array: ArrayLike<TElement>,\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): Map<TKey, TNewElement> {\n const result = new Map<TKey, TNewElement>();\n\n for (let i = 0; i < array.length; ++i) {\n const [key, element] = f(array[i] as TElement, i);\n result.set(key, element);\n }\n\n return result;\n}\n\nexport function mapKeyLastByFn<TKey, TElement, TNewElement>(\n f: (element: TElement, index: number) => readonly [TKey, TNewElement]\n): (array: ArrayLike<TElement>) => Map<TKey, TNewElement> {\n return array => mapKeyLastBy(array, f);\n}\n\nexport interface IdentityGrouping<T> {\n readonly identity: (element: T) => unknown;\n}\n\nexport interface EqualityGrouping<T> {\n readonly equal: (a: T, b: T) => boolean;\n readonly hash?: (element: T, index: number) => unknown;\n}\n\nexport interface OrderedGrouping<T> {\n readonly compare: Comparator<T>;\n readonly hash?: (element: T, index: number) => unknown;\n}\n\nexport interface HashGrouping<T> {\n readonly hash: (element: T, index: number) => unknown;\n}\n\nexport type Grouping<T> =\n | IdentityGrouping<T>\n | EqualityGrouping<T>\n | OrderedGrouping<T>\n | HashGrouping<T>;\n\nexport function group<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[][] {\n if (\"identity\" in grouping) {\n return groupByIdentity(array, grouping.identity);\n } else if (\"compare\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return groupByOrderWithHash(array, grouping.compare, grouping.hash);\n } else {\n return groupByOrder(array, grouping.compare);\n }\n } else if (\"equal\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return groupByEqualityWithHash(array, grouping.equal, grouping.hash);\n } else {\n return groupByEquality(array, grouping.equal);\n }\n } else {\n return groupByHash(array, grouping.hash);\n }\n}\n\nexport function groupFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[][] {\n return array => group(array, grouping);\n}\n\nexport function groupByIdentity<T>(\n array: ArrayLike<T>,\n identity: (element: T) => unknown = element => element\n): T[][] {\n const groups: T[][] = [];\n const map = new Map<unknown, T[]>();\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const key = identity(element);\n const group = map.get(key) ?? [];\n group.push(element);\n if (!map.has(key)) {\n groups.push(group);\n map.set(key, group);\n }\n }\n return groups;\n}\n\nexport function groupByIdentityFn<T>(\n identity: (element: T) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByIdentity(array, identity);\n}\n\nexport function groupByEquality<T>(array: ArrayLike<T>, equal: (a: T, b: T) => boolean): T[][] {\n const result: T[][] = [];\n\n outer: for (let i = 0; i < array.length; ++i) {\n for (let j = 0; j < result.length; ++j) {\n const group = notNull(result[j]);\n if (equal(group[0] as T, array[i] as T)) {\n group.push(array[i] as T);\n continue outer;\n }\n }\n\n result.push([array[i] as T]);\n }\n\n return result;\n}\n\nexport function groupByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByEquality(array, equal);\n}\n\nexport function groupByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[][] {\n // TODO: This could use a binary tree to be way more efficient\n return groupByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function groupByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[][] {\n return array => groupByOrder(array, compare);\n}\n\nexport function groupByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[][] {\n const groups = new Map<unknown, T[]>();\n const result: T[][] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n\n const group = groups.get(h) ?? [];\n if (!groups.has(h)) {\n result.push(group);\n groups.set(h, group);\n }\n group.push(element);\n }\n\n return result;\n}\n\nexport function groupByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByHash(array, hash);\n}\n\nexport function groupByEqualityWithHash<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): T[][] {\n const groups = new Map<unknown, T[][]>();\n const result: T[][] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n\n const hashGroup = groups.get(h) ?? [];\n if (!groups.has(h)) {\n groups.set(h, hashGroup);\n }\n const group = find(hashGroup, group => equal(group[0] as T, element));\n if (group == null) {\n const newGroup = [element];\n hashGroup.push(newGroup);\n result.push(newGroup);\n } else {\n group.push(element);\n }\n }\n\n return result;\n}\n\nexport function groupByEqualityWithHashFn<T>(\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByEqualityWithHash(array, equal, hash);\n}\n\nexport function groupByOrderWithHash<T>(\n array: ArrayLike<T>,\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): T[][] {\n return groupByEqualityWithHash(array, (a, b) => compare(a, b) === Comparison.equal, hash);\n}\n\nexport function groupByOrderWithHashFn<T>(\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupByOrderWithHash(array, compare, hash);\n}\n\nexport function groupAdjacent<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[][] {\n if (\"identity\" in grouping) {\n return groupAdjacentByIdentity(array, grouping.identity);\n } else if (\"equal\" in grouping) {\n return groupAdjacentByEquality(array, grouping.equal);\n } else if (\"compare\" in grouping) {\n return groupAdjacentByOrder(array, grouping.compare);\n } else {\n return groupByHash(array, grouping.hash);\n }\n}\n\nexport function groupAdjacentFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacent(array, grouping);\n}\n\nexport function groupAdjacentByIdentity<T>(\n array: ArrayLike<T>,\n identity?: (element: T) => unknown\n): T[][] {\n return identity == null\n ? groupAdjacentByEquality(array, (a, b) => a === b)\n : groupAdjacentByEquality(array, (a, b) => identity(a) === identity(b));\n}\n\nexport function groupAdjacentByIdentityFn<T>(\n identity: (element: T) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByEquality(array, (a, b) => identity(a) === identity(b));\n}\n\nexport function groupAdjacentByEquality<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean\n): T[][] {\n if (array.length === 0) {\n return [];\n }\n\n let element = array[0] as T;\n let group: T[] = [element];\n const result: T[][] = [group];\n\n for (let i = 1; i < array.length; ++i) {\n const prev = element;\n element = array[i] as T;\n if (equal(prev, element)) {\n group.push(element);\n } else {\n group = [element];\n result.push(group);\n }\n }\n\n return result;\n}\n\nexport function groupAdjacentByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByEquality(array, equal);\n}\n\nexport function groupAdjacentByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[][] {\n return groupAdjacentByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function groupAdjacentByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByOrder(array, compare);\n}\n\nexport function groupAdjacentByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[][] {\n if (array.length === 0) {\n return [];\n }\n\n const element = array[0] as T;\n let h = hash(element, 0);\n let group: T[] = [element];\n const result: T[][] = [group];\n\n for (let i = 1; i < array.length; ++i) {\n const element = array[i] as T;\n const h1 = hash(element, i);\n if (h === h1) {\n group.push(element);\n } else {\n h = h1;\n group = [element];\n result.push(group);\n }\n }\n\n return result;\n}\n\nexport function groupAdjacentByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[][] {\n return array => groupAdjacentByHash(array, hash);\n}\n\nexport function unique<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[] {\n if (\"identity\" in grouping) {\n return uniqueByIdentityInternal(array, grouping.identity);\n } else if (\"compare\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return uniqueByOrderWithHash(array, grouping.compare, grouping.hash);\n } else {\n return uniqueByOrder(array, grouping.compare);\n }\n } else if (\"equal\" in grouping) {\n if (typeof grouping.hash === \"function\") {\n return uniqueByEqualityWithHash(array, grouping.equal, grouping.hash);\n } else {\n return uniqueByEquality(array, grouping.equal);\n }\n } else {\n return uniqueByHash(array, grouping.hash);\n }\n}\n\nexport function uniqueFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[] {\n return array => unique(array, grouping);\n}\n\nexport function uniqueByIdentity<T>(array: ArrayLike<T>, identity?: (element: T) => unknown): T[] {\n return uniqueByIdentityInternal(array, identity ?? (element => element));\n}\n\nfunction uniqueByIdentityInternal<T>(array: ArrayLike<T>, identity: (element: T) => unknown): T[] {\n const set = new Set<unknown>();\n const result: T[] = [];\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n if (!set.has(identity(element))) {\n set.add(identity(element));\n result.push(element);\n }\n }\n return result;\n}\n\nexport function uniqueByEquality<T>(array: ArrayLike<T>, equal: (a: T, b: T) => boolean): T[] {\n const result: T[] = [];\n\n outer: for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n for (let j = 0; j < result.length; ++j) {\n if (equal(element, result[j] as T)) {\n continue outer;\n }\n }\n result.push(element);\n }\n\n return result;\n}\n\nexport function uniqueByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByEquality(array, equal);\n}\n\nexport function uniqueByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[] {\n return uniqueByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function uniqueByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[] {\n // TODO: This could use a binary tree to be more efficient\n return array => uniqueByOrder(array, compare);\n}\n\nexport function uniqueByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[] {\n const seen = new Set<unknown>();\n const result: T[] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n if (!seen.has(h)) {\n seen.add(h);\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByHash(array, hash);\n}\n\nexport function uniqueByEqualityWithHash<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): T[] {\n const seenGroups = new Map<unknown, T[]>();\n const result: T[] = [];\n\n for (let i = 0; i < array.length; ++i) {\n const element = array[i] as T;\n const h = hash(element, i);\n\n const seenGroup = seenGroups.get(h) ?? [];\n\n if (!seenGroups.has(h)) {\n seenGroups.set(h, seenGroup);\n }\n\n if (all(seenGroup, seenElement => !equal(seenElement, element))) {\n seenGroup.push(element);\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueByEqualityWithHashFn<T>(\n equal: (a: T, b: T) => boolean,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByEqualityWithHash(array, equal, hash);\n}\n\nexport function uniqueByOrderWithHash<T>(\n array: ArrayLike<T>,\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): T[] {\n return uniqueByEqualityWithHash(array, (a, b) => compare(a, b) === Comparison.equal, hash);\n}\n\nexport function uniqueByOrderWithHashFn<T>(\n compare: Comparator<T>,\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueByOrderWithHash(array, compare, hash);\n}\n\nexport function uniqueAdjacent<T>(array: ArrayLike<T>, grouping: Grouping<T>): T[] {\n if (\"identity\" in grouping) {\n return uniqueAdjacentByIdentity(array, grouping.identity);\n } else if (\"equal\" in grouping) {\n return uniqueAdjacentByEquality(array, grouping.equal);\n } else if (\"compare\" in grouping) {\n return uniqueAdjacentByOrder(array, grouping.compare);\n } else {\n return uniqueAdjacentByHash(array, grouping.hash);\n }\n}\n\nexport function uniqueAdjacentFn<T>(grouping: Grouping<T>): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacent(array, grouping);\n}\n\nexport function uniqueAdjacentByIdentity<T>(\n array: ArrayLike<T>,\n identity?: (element: T) => unknown\n): T[] {\n return identity == null\n ? uniqueAdjacentByEquality(array, (a, b) => a === b)\n : uniqueAdjacentByEquality(array, (a, b) => identity(a) === identity(b));\n}\n\nexport function uniqueAdjacentByIdentityFn<T>(\n identity: (element: T) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByIdentity(array, identity);\n}\n\nexport function uniqueAdjacentByEquality<T>(\n array: ArrayLike<T>,\n equal: (a: T, b: T) => boolean\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n let element = array[0] as T;\n const result = [element];\n\n for (let i = 1; i < array.length; ++i) {\n const prev = element;\n element = array[i] as T;\n if (!equal(prev, element)) {\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueAdjacentByEqualityFn<T>(\n equal: (a: T, b: T) => boolean\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByEquality(array, equal);\n}\n\nexport function uniqueAdjacentByOrder<T>(array: ArrayLike<T>, compare: Comparator<T>): T[] {\n return uniqueAdjacentByEquality(array, (a, b) => compare(a, b) === Comparison.equal);\n}\n\nexport function uniqueAdjacentByOrderFn<T>(compare: Comparator<T>): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByOrder(array, compare);\n}\n\nexport function uniqueAdjacentByHash<T>(\n array: ArrayLike<T>,\n hash: (element: T, index: number) => unknown\n): T[] {\n if (array.length === 0) {\n return [];\n }\n\n const element = array[0] as T;\n let h = hash(element, 0);\n const result = [element];\n\n for (let i = 1; i < array.length; ++i) {\n const element = array[i] as T;\n const h1 = hash(element, i);\n if (h !== h1) {\n h = h1;\n result.push(element);\n }\n }\n\n return result;\n}\n\nexport function uniqueAdjacentByHashFn<T>(\n hash: (element: T, index: number) => unknown\n): (array: ArrayLike<T>) => T[] {\n return array => uniqueAdjacentByHash(array, hash);\n}\n\n/** @deprecated Use [array-shuffle](https://npmjs.com/array-shuffle) instead. */\nexport function shuffle<T>(array: ArrayLike<T>): T[] {\n const result = copy(array);\n for (let i = 0; i < array.length; ++i) {\n const j = i + Math.floor(Math.random() * (array.length - i));\n const replacement = result[j] as T;\n result[j] = result[i] as T;\n result[i] = replacement;\n }\n return result;\n}\n\nexport function sort(array: ArrayLike<boolean>): boolean[];\nexport function sort(array: ArrayLike<number>): number[];\nexport function sort(array: ArrayLike<string>): string[];\nexport function sort<T>(array: ArrayLike<T>, comparator: Comparator<T>): T[];\nexport function sort<T>(array: ArrayLike<T>, comparator?: Comparator<T>): T[] {\n return copy(array).sort(comparator ?? (defaultCompare as unknown as Comparator<T>));\n}\n\nexport function sortFn<T>(comparator: Comparator<T>): (array: ArrayLike<T>) => T[] {\n return array => sort(array, comparator);\n}\n\nexport function sortBy<T>(array: ArrayLike<T>, select: SortSelect<T>): T[] {\n return sort(array, (a, b) =>\n (defaultCompare as Comparator<string | number | boolean>)(select(a), select(b))\n );\n}\n\nexport function sortByFn<T>(select: SortSelect<T>): (array: ArrayLike<T>) => T[] {\n return array => sortBy(array, select);\n}\n\nexport function sortByDescending<T>(array: ArrayLike<T>, select: SortSelect<T>): T[] {\n return sort(\n array,\n (a, b) => -(defaultCompare as Comparator<string | number | boolean>)(select(a), select(b))\n );\n}\n\nexport function sortByDescendingFn<T>(select: SortSelect<T>): (array: ArrayLike<T>) => T[] {\n return array => sortByDescending(array, select);\n}\n\nexport type SortSelect<T> =\n | ((element: T) => boolean)\n | ((element: T) => number)\n | ((element: T) => string);\n\nexport function forEach<T>(\n array: ArrayLike<T>,\n f: (element: T, index: number) => void\n): typeof array {\n for (let i = 0; i < array.length; ++i) {\n f(array[i] as T, i);\n }\n return array;\n}\n\nexport function forEachFn<T>(\n f: (element: T, index: number) => void\n): (array: ArrayLike<T>) => typeof array {\n return array => forEach(array, f);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softwareventures/array",
3
- "version": "6.0.3",
3
+ "version": "6.1.0",
4
4
  "description": "Pure functional array manipulation and traversal",
5
5
  "keywords": [
6
6
  "array",
@@ -14,9 +14,9 @@
14
14
  "repository": "github:softwareventures/array",
15
15
  "license": "ISC",
16
16
  "scripts": {
17
- "pre-commit": "precise-commits",
18
17
  "fix": "tsc --noEmit && eslint . --fix && prettier --write .",
19
18
  "lint": "tsc --noEmit && eslint . && prettier --check .",
19
+ "pre-commit": "precise-commits",
20
20
  "prepare": "husky install && tsc",
21
21
  "semantic-release": "semantic-release",
22
22
  "test": "ava"
@@ -31,26 +31,27 @@
31
31
  "tslib": "^2.0.0"
32
32
  },
33
33
  "devDependencies": {
34
- "@softwareventures/eslint-config": "7.0.1",
35
- "@softwareventures/precise-commits": "3.0.3",
34
+ "@softwareventures/eslint-config": "7.1.4",
35
+ "@softwareventures/precise-commits": "3.0.30",
36
36
  "@softwareventures/prettier-config": "4.0.0",
37
- "@softwareventures/semantic-release-config": "3.0.0",
38
- "@softwareventures/tsconfig": "7.0.0",
39
- "@typescript-eslint/eslint-plugin": "5.43.0",
40
- "@typescript-eslint/parser": "5.43.0",
41
- "ava": "5.1.0",
37
+ "@softwareventures/semantic-release-config": "4.0.0",
38
+ "@softwareventures/tsconfig": "7.1.0",
39
+ "@typescript-eslint/eslint-plugin": "6.13.2",
40
+ "@typescript-eslint/parser": "6.13.2",
41
+ "ava": "5.3.1",
42
+ "conventional-changelog-conventionalcommits": "7.0.2",
42
43
  "cz-conventional-changelog": "3.3.0",
43
- "eslint": "8.27.0",
44
- "eslint-config-prettier": "8.5.0",
45
- "eslint-plugin-import": "2.26.0",
46
- "eslint-plugin-jsdoc": "39.6.2",
44
+ "eslint": "8.55.0",
45
+ "eslint-config-prettier": "9.1.0",
46
+ "eslint-plugin-import": "2.29.0",
47
+ "eslint-plugin-jsdoc": "46.9.0",
47
48
  "eslint-plugin-prefer-arrow": "1.2.3",
48
- "eslint-plugin-sonarjs": "0.16.0",
49
- "husky": "8.0.2",
50
- "prettier": "2.7.1",
51
- "semantic-release": "19.0.3",
49
+ "eslint-plugin-sonarjs": "0.23.0",
50
+ "husky": "8.0.3",
51
+ "prettier": "2.8.8",
52
+ "semantic-release": "22.0.9",
52
53
  "ts-node": "10.9.1",
53
- "typescript": "4.9.3"
54
+ "typescript": "5.2.2"
54
55
  },
55
56
  "eslintConfig": {
56
57
  "root": true,