1 | /**
|
2 | * Utility module to work with Arrays.
|
3 | *
|
4 | * @module array
|
5 | */
|
6 |
|
7 | /**
|
8 | * Return the last element of an array. The element must exist
|
9 | *
|
10 | * @template L
|
11 | * @param {Array<L>} arr
|
12 | * @return {L}
|
13 | */
|
14 | export const last = arr => arr[arr.length - 1]
|
15 |
|
16 | /**
|
17 | * @template C
|
18 | * @return {Array<C>}
|
19 | */
|
20 | export const create = () => /** @type {Array<C>} */ ([])
|
21 |
|
22 | /**
|
23 | * @template D
|
24 | * @param {Array<D>} a
|
25 | * @return {Array<D>}
|
26 | */
|
27 | export const copy = a => /** @type {Array<D>} */ (a.slice())
|
28 |
|
29 | /**
|
30 | * Append elements from src to dest
|
31 | *
|
32 | * @template M
|
33 | * @param {Array<M>} dest
|
34 | * @param {Array<M>} src
|
35 | */
|
36 | export const appendTo = (dest, src) => {
|
37 | for (let i = 0; i < src.length; i++) {
|
38 | dest.push(src[i])
|
39 | }
|
40 | }
|
41 |
|
42 | /**
|
43 | * Transforms something array-like to an actual Array.
|
44 | *
|
45 | * @function
|
46 | * @template T
|
47 | * @param {ArrayLike<T>|Iterable<T>} arraylike
|
48 | * @return {T}
|
49 | */
|
50 | export const from = Array.from
|
51 |
|
52 | /**
|
53 | * True iff condition holds on every element in the Array.
|
54 | *
|
55 | * @function
|
56 | * @template ITEM
|
57 | *
|
58 | * @param {Array<ITEM>} arr
|
59 | * @param {function(ITEM, number, Array<ITEM>):boolean} f
|
60 | * @return {boolean}
|
61 | */
|
62 | export const every = (arr, f) => arr.every(f)
|
63 |
|
64 | /**
|
65 | * True iff condition holds on some element in the Array.
|
66 | *
|
67 | * @function
|
68 | * @template S
|
69 | * @param {Array<S>} arr
|
70 | * @param {function(S, number, Array<S>):boolean} f
|
71 | * @return {boolean}
|
72 | */
|
73 | export const some = (arr, f) => arr.some(f)
|
74 |
|
75 | /**
|
76 | * @template ELEM
|
77 | *
|
78 | * @param {Array<ELEM>} a
|
79 | * @param {Array<ELEM>} b
|
80 | * @return {boolean}
|
81 | */
|
82 | export const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])
|
83 |
|
84 | /**
|
85 | * @template ELEM
|
86 | * @param {Array<Array<ELEM>>} arr
|
87 | * @return {Array<ELEM>}
|
88 | */
|
89 | export const flatten = arr => arr.reduce((acc, val) => acc.concat(val), [])
|
90 |
|
91 | export const isArray = Array.isArray
|