1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.compile = void 0;
|
4 | var boolbase_1 = require("boolbase");
|
5 | /**
|
6 | * Returns a function that checks if an elements index matches the given rule
|
7 | * highly optimized to return the fastest solution.
|
8 | *
|
9 | * @param parsed A tuple [a, b], as returned by `parse`.
|
10 | * @returns A highly optimized function that returns whether an index matches the nth-check.
|
11 | * @example
|
12 | * const check = nthCheck.compile([2, 3]);
|
13 | *
|
14 | * check(0); // `false`
|
15 | * check(1); // `false`
|
16 | * check(2); // `true`
|
17 | * check(3); // `false`
|
18 | * check(4); // `true`
|
19 | * check(5); // `false`
|
20 | * check(6); // `true`
|
21 | */
|
22 | function compile(parsed) {
|
23 | var a = parsed[0];
|
24 | // Subtract 1 from `b`, to convert from one- to zero-indexed.
|
25 | var b = parsed[1] - 1;
|
26 | /*
|
27 | * When `b <= 0`, `a * n` won't be lead to any matches for `a < 0`.
|
28 | * Besides, the specification states that no elements are
|
29 | * matched when `a` and `b` are 0.
|
30 | *
|
31 | * `b < 0` here as we subtracted 1 from `b` above.
|
32 | */
|
33 | if (b < 0 && a <= 0)
|
34 | return boolbase_1.falseFunc;
|
35 | // When `a` is in the range -1..1, it matches any element (so only `b` is checked).
|
36 | if (a === -1)
|
37 | return function (index) { return index <= b; };
|
38 | if (a === 0)
|
39 | return function (index) { return index === b; };
|
40 | // When `b <= 0` and `a === 1`, they match any element.
|
41 | if (a === 1)
|
42 | return b < 0 ? boolbase_1.trueFunc : function (index) { return index >= b; };
|
43 | /*
|
44 | * Otherwise, modulo can be used to check if there is a match.
|
45 | *
|
46 | * Modulo doesn't care about the sign, so let's use `a`s absolute value.
|
47 | */
|
48 | var absA = Math.abs(a);
|
49 | // Get `b mod a`, + a if this is negative.
|
50 | var bMod = ((b % absA) + absA) % absA;
|
51 | return a > 1
|
52 | ? function (index) { return index >= b && index % absA === bMod; }
|
53 | : function (index) { return index <= b && index % absA === bMod; };
|
54 | }
|
55 | exports.compile = compile;
|