@nxtedition/ranges 1.0.4 → 1.0.6

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.
Files changed (2) hide show
  1. package/lib/index.js +40 -26
  2. package/package.json +2 -2
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,15 +19,17 @@ export function merge(ranges ) {
9
19
 
10
20
  if (ranges.length === 1) {
11
21
  const range = ranges[0]
12
- return Array.isArray(range) && range.length === 2 && range[1] > range[0] ? ranges : EMPTY_ARR
22
+ return isValidRange(range) ? [[range[0], range[1]]] : EMPTY_ARR
13
23
  }
14
24
 
15
- ranges = ranges.filter(
16
- (range) => Array.isArray(range) && range.length === 2 && range[1] > range[0],
17
- )
25
+ ranges = ranges.filter(isValidRange)
26
+
27
+ if (ranges.length === 0) {
28
+ return EMPTY_ARR
29
+ }
18
30
 
19
- if (ranges.length <= 1) {
20
- return ranges
31
+ if (ranges.length === 1) {
32
+ return [[ranges[0][0], ranges[0][1]]]
21
33
  }
22
34
 
23
35
  ranges.sort((a, b) => a[0] - b[0])
@@ -30,16 +42,6 @@ export function merge(ranges ) {
30
42
  const range = ranges[n]
31
43
  const top = stack[stack.length - 1]
32
44
 
33
- if (
34
- !Array.isArray(range) ||
35
- range.length !== 2 ||
36
- !Number.isFinite(range[0]) ||
37
- !Number.isFinite(range[1]) ||
38
- range[0] > range[1]
39
- ) {
40
- continue
41
- }
42
-
43
45
  if (top[1] < range[0]) {
44
46
  stack.push([range[0], range[1]])
45
47
  } else if (top[1] < range[1]) {
@@ -51,23 +53,35 @@ export function merge(ranges ) {
51
53
  }
52
54
 
53
55
  export function subtract(a , b ) {
54
- const pending = a.map((r) => [r[0], r[1]])
56
+ if (!Array.isArray(a) || a.length === 0) {
57
+ return EMPTY_ARR
58
+ }
55
59
 
56
- const c = []
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
+ }
57
67
 
58
- while (pending.length > 0) {
59
- const ar = pending.shift()
68
+ const validB = Array.isArray(b) ? b.filter(isValidRange) : []
60
69
 
61
- if (ar[1] <= ar[0]) {
62
- continue
63
- }
70
+ const c = []
64
71
 
65
- const br = b.find((br) => ar[0] < br[1] && br[0] < ar[1])
72
+ while (pending.length > 0) {
73
+ const ar = pending.pop()
74
+ const br = validB.find((br) => ar[0] < br[1] && br[0] < ar[1])
66
75
  if (!br) {
67
76
  c.push(ar)
68
77
  } else {
69
- pending.unshift([br[1], ar[1]])
70
- pending.unshift([ar[0], br[0]])
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
+ }
71
85
  }
72
86
  }
73
87
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/ranges",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -28,5 +28,5 @@
28
28
  "rimraf": "^6.1.3",
29
29
  "typescript": "^5.9.3"
30
30
  },
31
- "gitHead": "a95ef1b72677b853fd7943f7071c266f1789e134"
31
+ "gitHead": "7e5874931730a283de31418b891b69627ff5acae"
32
32
  }