| 1 |
export const parseJSONArrayWithRanges = ( |
| 2 |
lineNumbers: string, |
| 3 |
startingLineNumber: string, |
| 4 |
) => { |
| 5 |
try { |
| 6 |
return ( |
| 7 |
JSON.parse(`[${lineNumbers ?? ''}]`) |
| 8 |
.map((inner: number | number[]) => { |
| 9 |
// offset by startingLineNumber |
| 10 |
const offset = Number.isNaN(Number(startingLineNumber)) |
| 11 |
? 0 |
| 12 |
: Math.max(Number(startingLineNumber) - 1, 0); |
| 13 |
// incoming might look like 1, 3, or [4, 8] |
| 14 |
if (typeof inner === 'number') return inner - offset; |
| 15 |
return Array.from( |
| 16 |
{ length: inner[1] - inner[0] + 1 }, |
| 17 |
(_, i) => inner[0] + i - offset, |
| 18 |
); |
| 19 |
}) |
| 20 |
// filter out empty arrays |
| 21 |
.filter((inner: number | number[]) => |
| 22 |
Array.isArray(inner) ? inner?.length > 0 : true, |
| 23 |
) |
| 24 |
.flat() |
| 25 |
// filter out negative numbers |
| 26 |
.filter((inner: number) => inner >= 0) |
| 27 |
); |
| 28 |
} catch (e) { |
| 29 |
console.error(e); |
| 30 |
return []; |
| 31 |
} |
| 32 |
}; |
| 33 |
|
| 34 |
export const parseStringArrayWithSingleNestedArray = (lineNumbers?: string) => { |
| 35 |
const nums = JSON.parse(`[${lineNumbers ?? ''}]`); |
| 36 |
// Checking for nested arrays |
| 37 |
const nested = nums.filter((n: number | number[]) => Array.isArray(n)); |
| 38 |
const doubly = nested.some((n: number[]) => n.some((k) => Array.isArray(k))); |
| 39 |
if (doubly) { |
| 40 |
throw new Error('Nested arrays not allowed'); |
| 41 |
} |
| 42 |
if (nested.some((n: number[]) => n[0] >= n[1])) { |
| 43 |
throw new Error('Nested arrays must be in order'); |
| 44 |
} |
| 45 |
return true; |
| 46 |
}; |
| 47 |
|