| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | "use strict";var __importDefault = (this && this.__importDefault) || function (mod) {    return (mod && mod.__esModule) ? mod : { "default": mod };};Object.defineProperty(exports, "__esModule", { value: true });exports.generate = exports.compile = void 0;var boolbase_1 = __importDefault(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 * * ```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` * ``` */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.default.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.default.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;/** * 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 * ``` */function generate(parsed) {    var a = parsed[0];    // Subtract 1 from `b`, to convert from one- to zero-indexed.    var b = parsed[1] - 1;    var n = 0;    // Make sure to always return an increasing sequence    if (a < 0) {        var aPos_1 = -a;        // Get `b mod a`        var minValue_1 = ((b % aPos_1) + aPos_1) % aPos_1;        return function () {            var val = minValue_1 + aPos_1 * n++;            return val > b ? null : val;        };    }    if (a === 0)        return b < 0            ? // There are no result — always return `null`                function () { return null; }            : // Return `b` exactly once                function () { return (n++ === 0 ? b : null); };    if (b < 0) {        b += a * Math.ceil(-b / a);    }    return function () { return a * n++ + b; };}exports.generate = generate;//# sourceMappingURL=compile.js.map
 |