aboutsummaryrefslogtreecommitdiff
path: root/node_modules/nth-check/lib/compile.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-02-09 17:58:07 +0100
committerMinteck <contact@minteck.org>2022-02-09 17:58:07 +0100
commit22a25ded9f7d9c9a96cce8d1bc12475ca0434201 (patch)
tree0e33d0650fe58f41c00bbc4b8047956905766823 /node_modules/nth-check/lib/compile.js
parent8f54d903fb3470823a5e4d6ff4655de009836245 (diff)
downloadyoutoo-22a25ded9f7d9c9a96cce8d1bc12475ca0434201.tar.gz
youtoo-22a25ded9f7d9c9a96cce8d1bc12475ca0434201.tar.bz2
youtoo-22a25ded9f7d9c9a96cce8d1bc12475ca0434201.zip
Major update
Diffstat (limited to 'node_modules/nth-check/lib/compile.js')
-rw-r--r--node_modules/nth-check/lib/compile.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/node_modules/nth-check/lib/compile.js b/node_modules/nth-check/lib/compile.js
new file mode 100644
index 0000000..1cf3b09
--- /dev/null
+++ b/node_modules/nth-check/lib/compile.js
@@ -0,0 +1,55 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.compile = void 0;
+var boolbase_1 = require("boolbase");
+/**
+ * Returns a function that checks if an elements index matches the given rule
+ * highly optimized to return the fastest solution.
+ *
+ * @param parsed A tuple [a, b], as returned by `parse`.
+ * @returns A highly optimized function that returns whether an index matches the nth-check.
+ * @example
+ * const check = nthCheck.compile([2, 3]);
+ *
+ * check(0); // `false`
+ * check(1); // `false`
+ * check(2); // `true`
+ * check(3); // `false`
+ * check(4); // `true`
+ * check(5); // `false`
+ * check(6); // `true`
+ */
+function compile(parsed) {
+ var a = parsed[0];
+ // Subtract 1 from `b`, to convert from one- to zero-indexed.
+ var b = parsed[1] - 1;
+ /*
+ * When `b <= 0`, `a * n` won't be lead to any matches for `a < 0`.
+ * Besides, the specification states that no elements are
+ * matched when `a` and `b` are 0.
+ *
+ * `b < 0` here as we subtracted 1 from `b` above.
+ */
+ if (b < 0 && a <= 0)
+ return boolbase_1.falseFunc;
+ // When `a` is in the range -1..1, it matches any element (so only `b` is checked).
+ if (a === -1)
+ return function (index) { return index <= b; };
+ if (a === 0)
+ return function (index) { return index === b; };
+ // When `b <= 0` and `a === 1`, they match any element.
+ if (a === 1)
+ return b < 0 ? boolbase_1.trueFunc : function (index) { return index >= b; };
+ /*
+ * Otherwise, modulo can be used to check if there is a match.
+ *
+ * Modulo doesn't care about the sign, so let's use `a`s absolute value.
+ */
+ var absA = Math.abs(a);
+ // Get `b mod a`, + a if this is negative.
+ var bMod = ((b % absA) + absA) % absA;
+ return a > 1
+ ? function (index) { return index >= b && index % absA === bMod; }
+ : function (index) { return index <= b && index % absA === bMod; };
+}
+exports.compile = compile;