@nxtedition/ranges 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +40 -37
- package/package.json +3 -3
package/lib/index.js
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
const EMPTY_ARR = Object.freeze([])
|
|
4
4
|
|
|
5
|
+
function isValidRange(range ) {
|
|
6
|
+
return (
|
|
7
|
+
Array.isArray(range) &&
|
|
8
|
+
range.length === 2 &&
|
|
9
|
+
Number.isFinite(range[0]) &&
|
|
10
|
+
Number.isFinite(range[1]) &&
|
|
11
|
+
range[1] > range[0]
|
|
12
|
+
)
|
|
13
|
+
}
|
|
14
|
+
|
|
5
15
|
export function merge(ranges ) {
|
|
6
16
|
if (!Array.isArray(ranges) || ranges.length === 0) {
|
|
7
17
|
return EMPTY_ARR
|
|
@@ -9,26 +19,17 @@ export function merge(ranges ) {
|
|
|
9
19
|
|
|
10
20
|
if (ranges.length === 1) {
|
|
11
21
|
const range = ranges[0]
|
|
12
|
-
return
|
|
13
|
-
range.length === 2 &&
|
|
14
|
-
Number.isFinite(range[0]) &&
|
|
15
|
-
Number.isFinite(range[1]) &&
|
|
16
|
-
range[1] > range[0]
|
|
17
|
-
? ranges
|
|
18
|
-
: EMPTY_ARR
|
|
22
|
+
return isValidRange(range) ? [[range[0], range[1]]] : EMPTY_ARR
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
ranges = ranges.filter(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Number.isFinite(range[1]) &&
|
|
27
|
-
range[1] > range[0],
|
|
28
|
-
)
|
|
25
|
+
ranges = ranges.filter(isValidRange)
|
|
26
|
+
|
|
27
|
+
if (ranges.length === 0) {
|
|
28
|
+
return EMPTY_ARR
|
|
29
|
+
}
|
|
29
30
|
|
|
30
|
-
if (ranges.length
|
|
31
|
-
return ranges
|
|
31
|
+
if (ranges.length === 1) {
|
|
32
|
+
return [[ranges[0][0], ranges[0][1]]]
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
ranges.sort((a, b) => a[0] - b[0])
|
|
@@ -41,16 +42,6 @@ export function merge(ranges ) {
|
|
|
41
42
|
const range = ranges[n]
|
|
42
43
|
const top = stack[stack.length - 1]
|
|
43
44
|
|
|
44
|
-
if (
|
|
45
|
-
!Array.isArray(range) ||
|
|
46
|
-
range.length !== 2 ||
|
|
47
|
-
!Number.isFinite(range[0]) ||
|
|
48
|
-
!Number.isFinite(range[1]) ||
|
|
49
|
-
range[0] > range[1]
|
|
50
|
-
) {
|
|
51
|
-
continue
|
|
52
|
-
}
|
|
53
|
-
|
|
54
45
|
if (top[1] < range[0]) {
|
|
55
46
|
stack.push([range[0], range[1]])
|
|
56
47
|
} else if (top[1] < range[1]) {
|
|
@@ -62,23 +53,35 @@ export function merge(ranges ) {
|
|
|
62
53
|
}
|
|
63
54
|
|
|
64
55
|
export function subtract(a , b ) {
|
|
65
|
-
|
|
56
|
+
if (!Array.isArray(a) || a.length === 0) {
|
|
57
|
+
return EMPTY_ARR
|
|
58
|
+
}
|
|
66
59
|
|
|
67
|
-
const
|
|
60
|
+
const pending = []
|
|
61
|
+
for (let i = a.length - 1; i >= 0; --i) {
|
|
62
|
+
const r = a[i]
|
|
63
|
+
if (isValidRange(r)) {
|
|
64
|
+
pending.push([r[0], r[1]])
|
|
65
|
+
}
|
|
66
|
+
}
|
|
68
67
|
|
|
69
|
-
|
|
70
|
-
const ar = pending.shift()
|
|
68
|
+
const validB = Array.isArray(b) ? b.filter(isValidRange) : []
|
|
71
69
|
|
|
72
|
-
|
|
73
|
-
continue
|
|
74
|
-
}
|
|
70
|
+
const c = []
|
|
75
71
|
|
|
76
|
-
|
|
72
|
+
while (pending.length > 0) {
|
|
73
|
+
const ar = pending.pop()
|
|
74
|
+
const br = validB.find((br) => ar[0] < br[1] && br[0] < ar[1])
|
|
77
75
|
if (!br) {
|
|
78
76
|
c.push(ar)
|
|
79
77
|
} else {
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
// Push right half first so left is popped next and processed first.
|
|
79
|
+
if (br[1] < ar[1]) {
|
|
80
|
+
pending.push([br[1], ar[1]])
|
|
81
|
+
}
|
|
82
|
+
if (ar[0] < br[0]) {
|
|
83
|
+
pending.push([ar[0], br[0]])
|
|
84
|
+
}
|
|
82
85
|
}
|
|
83
86
|
}
|
|
84
87
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nxtedition/ranges",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"access": "public"
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
|
-
"build": "rimraf lib && tsc && amaroc ./src/index.ts && mv src/index.js lib/",
|
|
17
|
+
"build": "rimraf lib && tsc -p tsconfig.build.json && amaroc ./src/index.ts && mv src/index.js lib/",
|
|
18
18
|
"prepublishOnly": "yarn build",
|
|
19
19
|
"typecheck": "tsc --noEmit",
|
|
20
20
|
"test": "node --test",
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"rimraf": "^6.1.3",
|
|
29
29
|
"typescript": "^5.9.3"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "7c9c7457c885c644c7a1e70ef894d4727ce240d6"
|
|
32
32
|
}
|