summaryrefslogtreecommitdiff
path: root/includes/external/addressbook/node_modules/nth-check/lib/esm/compile.js
diff options
context:
space:
mode:
authorRaindropsSys <contact@minteck.org>2023-04-06 22:18:28 +0200
committerRaindropsSys <contact@minteck.org>2023-04-06 22:18:28 +0200
commit83354b2b88218090988dd6e526b0a2505b57e0f1 (patch)
treee3c73c38a122a78bb7e66fbb99056407edd9d4b9 /includes/external/addressbook/node_modules/nth-check/lib/esm/compile.js
parent47b8f2299a483024c4a6a8876af825a010954caa (diff)
downloadpluralconnect-83354b2b88218090988dd6e526b0a2505b57e0f1.tar.gz
pluralconnect-83354b2b88218090988dd6e526b0a2505b57e0f1.tar.bz2
pluralconnect-83354b2b88218090988dd6e526b0a2505b57e0f1.zip
Updated 5 files and added 1110 files (automated)
Diffstat (limited to 'includes/external/addressbook/node_modules/nth-check/lib/esm/compile.js')
-rw-r--r--includes/external/addressbook/node_modules/nth-check/lib/esm/compile.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/includes/external/addressbook/node_modules/nth-check/lib/esm/compile.js b/includes/external/addressbook/node_modules/nth-check/lib/esm/compile.js
new file mode 100644
index 0000000..317d378
--- /dev/null
+++ b/includes/external/addressbook/node_modules/nth-check/lib/esm/compile.js
@@ -0,0 +1,113 @@
+import boolbase from "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
+ *
+ * ```js
+ * 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`
+ * ```
+ */
+export function compile(parsed) {
+ const a = parsed[0];
+ // Subtract 1 from `b`, to convert from one- to zero-indexed.
+ const 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.falseFunc;
+ // When `a` is in the range -1..1, it matches any element (so only `b` is checked).
+ if (a === -1)
+ return (index) => index <= b;
+ if (a === 0)
+ return (index) => index === b;
+ // When `b <= 0` and `a === 1`, they match any element.
+ if (a === 1)
+ return b < 0 ? boolbase.trueFunc : (index) => 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.
+ */
+ const absA = Math.abs(a);
+ // Get `b mod a`, + a if this is negative.
+ const bMod = ((b % absA) + absA) % absA;
+ return a > 1
+ ? (index) => index >= b && index % absA === bMod
+ : (index) => index <= b && index % absA === bMod;
+}
+/**
+ * Returns a function that produces a monotonously increasing sequence of indices.
+ *
+ * If the sequence has an end, the returned function will return `null` after
+ * the last index in the sequence.
+ *
+ * @param parsed A tuple [a, b], as returned by `parse`.
+ * @returns A function that produces a sequence of indices.
+ * @example <caption>Always increasing (2n+3)</caption>
+ *
+ * ```js
+ * const gen = nthCheck.generate([2, 3])
+ *
+ * gen() // `1`
+ * gen() // `3`
+ * gen() // `5`
+ * gen() // `8`
+ * gen() // `11`
+ * ```
+ *
+ * @example <caption>With end value (-2n+10)</caption>
+ *
+ * ```js
+ *
+ * const gen = nthCheck.generate([-2, 5]);
+ *
+ * gen() // 0
+ * gen() // 2
+ * gen() // 4
+ * gen() // null
+ * ```
+ */
+export function generate(parsed) {
+ const a = parsed[0];
+ // Subtract 1 from `b`, to convert from one- to zero-indexed.
+ let b = parsed[1] - 1;
+ let n = 0;
+ // Make sure to always return an increasing sequence
+ if (a < 0) {
+ const aPos = -a;
+ // Get `b mod a`
+ const minValue = ((b % aPos) + aPos) % aPos;
+ return () => {
+ const val = minValue + aPos * n++;
+ return val > b ? null : val;
+ };
+ }
+ if (a === 0)
+ return b < 0
+ ? // There are no result — always return `null`
+ () => null
+ : // Return `b` exactly once
+ () => (n++ === 0 ? b : null);
+ if (b < 0) {
+ b += a * Math.ceil(-b / a);
+ }
+ return () => a * n++ + b;
+}
+//# sourceMappingURL=compile.js.map \ No newline at end of file