@nxtedition/ranges 1.0.8 → 1.0.9

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/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Merge and subtract numeric ranges. Useful for byte ranges, time ranges, and similar interval arithmetic.
4
4
 
5
+ Replaces `@nxtedition/lib/merge-ranges` (removed from `@nxtedition/lib` in v29.0.14).
6
+
5
7
  ## Install
6
8
 
7
9
  ```sh
@@ -40,13 +42,17 @@ subtract(
40
42
 
41
43
  ## API
42
44
 
43
- ### `merge(ranges: Range[]): readonly Range[]`
45
+ ### `merge(ranges: readonly Range[]): readonly Range[]`
44
46
 
45
- Sorts and merges overlapping or adjacent ranges. Returns a new array of non-overlapping ranges. Invalid ranges (empty, reversed, non-finite) are filtered out.
47
+ Sorts and merges overlapping or adjacent ranges into a canonical list: sorted, disjoint, and fully coalesced. Invalid ranges (empty, reversed, non-finite, malformed) are filtered out. Does not modify the input, and the result never shares references with it.
46
48
 
47
49
  ### `subtract(a: readonly Range[], b: readonly Range[]): readonly Range[]`
48
50
 
49
- Subtracts ranges `b` from ranges `a`. Returns the remaining intervals. Does not modify the input arrays.
51
+ Subtracts the coverage of `b` from each range in `a`. Invalid ranges are filtered from **both** inputs note this means an open-ended range like `[x, Infinity]` in `b` subtracts nothing.
52
+
53
+ Each `a` range is reduced independently and its remainders are emitted in `a`'s order: the result is sorted and disjoint when `a` is (for example, the output of `merge`). If `a` contains overlapping, duplicate, or unsorted ranges, the result mirrors that shape — pass `merge(a)` first if you need canonical output.
54
+
55
+ `b` may be unsorted and overlapping. Does not modify the inputs, and the result never shares references with them.
50
56
 
51
57
  ### `Range`
52
58
 
@@ -54,7 +60,11 @@ Subtracts ranges `b` from ranges `a`. Returns the remaining intervals. Does not
54
60
  type Range = readonly [start: number, end: number]
55
61
  ```
56
62
 
57
- Ranges are half-open intervals: `start` is inclusive, `end` is exclusive.
63
+ Ranges are half-open intervals: `start` is inclusive, `end` is exclusive. Negative-zero endpoints are normalized to `0` in the output.
64
+
65
+ ### Empty results
66
+
67
+ An empty result may be a shared, frozen empty array rather than a fresh one. The return type is `readonly` — copy before mutating.
58
68
 
59
69
  ## License
60
70
 
package/lib/index.d.ts CHANGED
@@ -1,4 +1,20 @@
1
+ /**
2
+ * A half-open numeric interval: `start` is inclusive, `end` is exclusive.
3
+ */
1
4
  export type Range = readonly [start: number, end: number];
2
- export declare function merge(ranges: Range[]): readonly Range[];
5
+ /**
6
+ * Sorts and merges overlapping or adjacent ranges into a canonical list:
7
+ * sorted, disjoint, and fully coalesced. Invalid ranges (empty, reversed,
8
+ * non-finite, malformed) are filtered out. Does not modify the input;
9
+ * the result never shares references with it.
10
+ */
11
+ export declare function merge(ranges: readonly Range[]): readonly Range[];
12
+ /**
13
+ * Subtracts the coverage of `b` from each range in `a`. Invalid ranges in
14
+ * both inputs are filtered out. Each `a` range is reduced independently and
15
+ * its remainders are emitted in `a`'s order, so the result is sorted and
16
+ * disjoint when `a` is (e.g. the output of {@link merge}). Does not modify
17
+ * the inputs; the result never shares references with them.
18
+ */
3
19
  export declare function subtract(a: readonly Range[], b: readonly Range[]): readonly Range[];
4
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;AAczD,wBAAgB,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE,CAsCvD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,KAAK,EAAE,EAAE,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE,CAkCnF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;AA6BzD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE,CAgFhE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,KAAK,EAAE,EAAE,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE,CAgEnF"}
package/lib/index.js CHANGED
@@ -6,64 +6,160 @@ function isValidRange(range) {
6
6
  Number.isFinite(range[1]) &&
7
7
  range[1] > range[0]);
8
8
  }
9
+ // True if every entry is a valid range and each starts strictly after the
10
+ // previous one ends, i.e. the list is already sorted, disjoint, and has no
11
+ // adjacent ranges left to coalesce.
12
+ function isCanonical(ranges) {
13
+ let prevEnd = -Infinity;
14
+ for (let n = 0, len = ranges.length; n < len; ++n) {
15
+ const range = ranges[n];
16
+ if (!isValidRange(range) || range[0] <= prevEnd) {
17
+ return false;
18
+ }
19
+ prevEnd = range[1];
20
+ }
21
+ return true;
22
+ }
23
+ /**
24
+ * Sorts and merges overlapping or adjacent ranges into a canonical list:
25
+ * sorted, disjoint, and fully coalesced. Invalid ranges (empty, reversed,
26
+ * non-finite, malformed) are filtered out. Does not modify the input;
27
+ * the result never shares references with it.
28
+ */
9
29
  export function merge(ranges) {
10
30
  if (!Array.isArray(ranges) || ranges.length === 0) {
11
31
  return EMPTY_ARR;
12
32
  }
33
+ // `+ 0` normalizes -0 endpoints to 0 so output is deterministic regardless
34
+ // of code path (TypedArray sort orders -0 before 0; comparisons do not).
13
35
  if (ranges.length === 1) {
14
36
  const range = ranges[0];
15
- return isValidRange(range) ? [[range[0], range[1]]] : EMPTY_ARR;
37
+ return isValidRange(range) ? [[range[0] + 0, range[1] + 0]] : EMPTY_ARR;
38
+ }
39
+ // Fast path: input is typically already merged.
40
+ if (isCanonical(ranges)) {
41
+ const len = ranges.length;
42
+ const result = new Array(len);
43
+ for (let n = 0; n < len; ++n) {
44
+ const range = ranges[n];
45
+ result[n] = [range[0] + 0, range[1] + 0];
46
+ }
47
+ return result;
16
48
  }
17
- ranges = ranges.filter(isValidRange);
18
- if (ranges.length === 0) {
49
+ // Endpoint sweep: with starts and ends sorted independently, coverage is
50
+ // contiguous until the next start exceeds the current end.
51
+ const len = ranges.length;
52
+ const starts = new Float64Array(len);
53
+ const ends = new Float64Array(len);
54
+ let m = 0;
55
+ for (let n = 0; n < len; ++n) {
56
+ const range = ranges[n];
57
+ if (isValidRange(range)) {
58
+ starts[m] = range[0] + 0;
59
+ ends[m] = range[1] + 0;
60
+ ++m;
61
+ }
62
+ }
63
+ if (m === 0) {
19
64
  return EMPTY_ARR;
20
65
  }
21
- if (ranges.length === 1) {
22
- return [[ranges[0][0], ranges[0][1]]];
66
+ if (m === 1) {
67
+ return [[starts[0], ends[0]]];
23
68
  }
24
- ranges.sort((a, b) => a[0] - b[0]);
25
- const stack = [];
26
- stack.push([ranges[0][0], ranges[0][1]]);
27
- for (let n = 1, len = ranges.length; n < len; ++n) {
28
- const range = ranges[n];
29
- const top = stack[stack.length - 1];
30
- if (top[1] < range[0]) {
31
- stack.push([range[0], range[1]]);
69
+ if (m <= 32) {
70
+ // TypedArray#sort call overhead dominates at small sizes.
71
+ for (let i = 1; i < m; ++i) {
72
+ const sv = starts[i];
73
+ let j = i - 1;
74
+ while (j >= 0 && starts[j] > sv) {
75
+ starts[j + 1] = starts[j];
76
+ --j;
77
+ }
78
+ starts[j + 1] = sv;
79
+ const ev = ends[i];
80
+ j = i - 1;
81
+ while (j >= 0 && ends[j] > ev) {
82
+ ends[j + 1] = ends[j];
83
+ --j;
84
+ }
85
+ ends[j + 1] = ev;
32
86
  }
33
- else if (top[1] < range[1]) {
34
- top[1] = range[1];
87
+ }
88
+ else {
89
+ starts.subarray(0, m).sort();
90
+ ends.subarray(0, m).sort();
91
+ }
92
+ const result = [];
93
+ let open = starts[0];
94
+ for (let i = 0, last = m - 1; i < last; ++i) {
95
+ if (starts[i + 1] > ends[i]) {
96
+ result.push([open, ends[i]]);
97
+ open = starts[i + 1];
35
98
  }
36
99
  }
37
- return stack;
100
+ result.push([open, ends[m - 1]]);
101
+ return result;
38
102
  }
103
+ /**
104
+ * Subtracts the coverage of `b` from each range in `a`. Invalid ranges in
105
+ * both inputs are filtered out. Each `a` range is reduced independently and
106
+ * its remainders are emitted in `a`'s order, so the result is sorted and
107
+ * disjoint when `a` is (e.g. the output of {@link merge}). Does not modify
108
+ * the inputs; the result never shares references with them.
109
+ */
39
110
  export function subtract(a, b) {
40
111
  if (!Array.isArray(a) || a.length === 0) {
41
112
  return EMPTY_ARR;
42
113
  }
43
- const pending = [];
44
- for (let i = a.length - 1; i >= 0; --i) {
45
- const r = a[i];
46
- if (isValidRange(r)) {
47
- pending.push([r[0], r[1]]);
114
+ const nb = !Array.isArray(b) || b.length === 0 ? EMPTY_ARR : isCanonical(b) ? b : merge(b);
115
+ const c = [];
116
+ if (nb.length === 0) {
117
+ for (let i = 0, alen = a.length; i < alen; ++i) {
118
+ const range = a[i];
119
+ if (isValidRange(range)) {
120
+ c.push([range[0] + 0, range[1] + 0]);
121
+ }
48
122
  }
123
+ return c;
49
124
  }
50
- const validB = Array.isArray(b) ? b.filter(isValidRange) : [];
51
- const c = [];
52
- while (pending.length > 0) {
53
- const ar = pending.pop();
54
- const br = validB.find((br) => ar[0] < br[1] && br[0] < ar[1]);
55
- if (!br) {
56
- c.push(ar);
125
+ for (let i = 0, alen = a.length; i < alen; ++i) {
126
+ const range = a[i];
127
+ if (!isValidRange(range)) {
128
+ continue;
57
129
  }
58
- else {
59
- // Push right half first so left is popped next and processed first.
60
- if (br[1] < ar[1]) {
61
- pending.push([br[1], ar[1]]);
130
+ let start = range[0] + 0;
131
+ const end = range[1] + 0;
132
+ // First subtrahend that ends past `start` (binary search).
133
+ let lo = 0;
134
+ let hi = nb.length;
135
+ while (lo < hi) {
136
+ const mid = (lo + hi) >>> 1;
137
+ if (nb[mid][1] <= start) {
138
+ lo = mid + 1;
62
139
  }
63
- if (ar[0] < br[0]) {
64
- pending.push([ar[0], br[0]]);
140
+ else {
141
+ hi = mid;
65
142
  }
66
143
  }
144
+ for (let j = lo, blen = nb.length; j < blen; ++j) {
145
+ const br = nb[j];
146
+ const bs = br[0] + 0;
147
+ const be = br[1] + 0;
148
+ if (bs >= end) {
149
+ break;
150
+ }
151
+ if (bs > start) {
152
+ c.push([start, bs]);
153
+ }
154
+ if (be >= end) {
155
+ start = end;
156
+ break;
157
+ }
158
+ start = be;
159
+ }
160
+ if (start < end) {
161
+ c.push([start, end]);
162
+ }
67
163
  }
68
164
  return c;
69
165
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/ranges",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -17,15 +17,16 @@
17
17
  "build": "rimraf lib && tsc -p tsconfig.build.json",
18
18
  "prepublishOnly": "yarn build",
19
19
  "typecheck": "tsc --noEmit",
20
- "test": "node --test",
21
- "test:ci": "node --test",
22
- "test:coverage": "node --test --experimental-test-coverage --test-coverage-include=src/index.ts --test-coverage-lines=90 --test-coverage-branches=90 --test-coverage-functions=100"
20
+ "test": "node --test --test-timeout=30000",
21
+ "test:ci": "node --test --test-timeout=30000",
22
+ "test:coverage": "node --test --test-timeout=30000 --experimental-test-coverage --test-coverage-include=src/index.ts --test-coverage-lines=90 --test-coverage-branches=90 --test-coverage-functions=100"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^25.5.0",
26
+ "mitata": "^1.0.34",
26
27
  "oxlint-tsgolint": "^0.17.0",
27
28
  "rimraf": "^6.1.3",
28
29
  "typescript": "^5.9.3"
29
30
  },
30
- "gitHead": "7c9c7457c885c644c7a1e70ef894d4727ce240d6"
31
+ "gitHead": "c9f2526dc870597de119b8ec5083f97901d4a2e2"
31
32
  }