compile.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. "use strict";
  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;