@ctrl/magnet-link
Version:
Parse a magnet URI into an object
42 lines (41 loc) • 1.34 kB
JavaScript
const maxSelectOnlyFiles = 100_000;
export function composeRange(range) {
return range
.reduce((acc, cur, idx, arr) => {
if (idx === 0 || cur !== arr[idx - 1] + 1) {
acc.push([]);
}
acc[acc.length - 1].push(`${cur}`);
return acc;
}, [])
.map(cur => (cur.length > 1 ? `${cur[0]}-${cur[cur.length - 1]}` : `${cur[0]}`));
}
function generateRange(start, end, out) {
if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) || start < 0 || end < start) {
return;
}
if (out.length + end - start + 1 > maxSelectOnlyFiles) {
return;
}
for (let i = start; i <= end; i++) {
out.push(i);
}
}
export function parseRange(range) {
const acc = [];
// eslint-disable-next-line typescript-eslint/prefer-for-of -- indexed for-loop is faster
for (let i = 0; i < range.length; i++) {
const cur = range[i];
const dash = cur.indexOf('-');
if (dash === -1) {
const index = +cur;
if (Number.isSafeInteger(index) && index >= 0 && acc.length < maxSelectOnlyFiles) {
acc.push(index);
}
}
else if (dash > 0 && dash < cur.length - 1) {
generateRange(+cur.slice(0, dash), +cur.slice(dash + 1), acc);
}
}
return acc;
}