1 | ;
|
2 |
|
3 | /**
|
4 | * Gets zero-based index.
|
5 | * @param x an array
|
6 | * @param i index (-ve: from right) (0)
|
7 | */
|
8 | function index(x, i = 0) {
|
9 | return i < 0 ? Math.max(x.length + i, 0) : Math.min(i, x.length);
|
10 | }
|
11 |
|
12 | /**
|
13 | * Gets index range of part of array.
|
14 | * @param x an array
|
15 | * @param i start index (-ve: from right) (0)
|
16 | * @param I end index (-ve: from right) (X)
|
17 | * @returns [start index, end index]
|
18 | */
|
19 | function indexRange(x, i = 0, I = x.length) {
|
20 | i = index(x, i);
|
21 | I = Math.max(i, index(x, I));
|
22 | return [i, I];
|
23 | }
|
24 |
|
25 | /**
|
26 | * Counts the number of values.
|
27 | * @param x an array
|
28 | * @param i start index (-ve: from right) (0)
|
29 | * @param I end index (-ve: from right) (X)
|
30 | */
|
31 | function size(x, i = 0, I = x.length) {
|
32 | var [i, I] = indexRange(x, i, I);
|
33 | return I - i;
|
34 | }
|
35 |
|
36 | /**
|
37 | * Gets a part of array.
|
38 | * @param x an array (updated)
|
39 | * @param i start index (0)
|
40 | * @param I end index (end)
|
41 | * @returns x
|
42 | */
|
43 | function slice$(x, i = 0, I = x.length) {
|
44 | x.copyWithin(0, i, I);
|
45 | x.length = size(x, i, I);
|
46 | return x;
|
47 | }
|
48 |
|
49 | /**
|
50 | * Gets values from middle.
|
51 | * @param x an array (updated)
|
52 | * @param i start index (0)
|
53 | * @param n number of values (1)
|
54 | * @returns x
|
55 | */
|
56 | function middle$(x, i = 0, n = 1) {
|
57 | return slice$(x, i, i + n);
|
58 | }
|
59 |
|
60 | module.exports = middle$;
|