Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F101378067
compile.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Feb 9, 21:02
Size
3 KB
Mime Type
text/x-java
Expires
Tue, Feb 11, 21:02 (2 d)
Engine
blob
Format
Raw Data
Handle
24147910
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
compile.js
View Options
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
Event Timeline
Log In to Comment