recursive-set 2.2.0 → 2.2.1
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/dist/cjs/index.js +101 -72
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.ts +13 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +101 -72
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -10,57 +10,59 @@ exports.fromIterable = fromIterable;
|
|
|
10
10
|
const functional_red_black_tree_1 = __importDefault(require("functional-red-black-tree"));
|
|
11
11
|
/**
|
|
12
12
|
* @module recursive-set
|
|
13
|
-
* A mutable recursive set implementation enforcing Cantor's ZFC axioms
|
|
14
|
-
* Powered by Red-Black Trees for O(log n) operations
|
|
13
|
+
* A mutable recursive set implementation enforcing Cantor's ZFC axioms.
|
|
14
|
+
* Powered by functional Red-Black Trees for O(log n) operations and O(1) cloning.
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
16
|
+
class RecursiveSet {
|
|
17
|
+
// Underlying persistent data structure
|
|
18
|
+
_tree;
|
|
19
|
+
// Internal XOR-based hash for O(1) inequality checks
|
|
20
|
+
_hash = 0;
|
|
21
|
+
/**
|
|
22
|
+
* Static comparator for Red-Black Tree ordering.
|
|
23
|
+
* Handles primitives, RecursiveSets, and deep structural equality.
|
|
24
|
+
*/
|
|
25
|
+
static compare(a, b) {
|
|
26
|
+
// 1. Identity optimization
|
|
27
|
+
if (a === b)
|
|
28
|
+
return 0;
|
|
29
|
+
// 2. Type separation
|
|
30
|
+
const isSetA = a instanceof RecursiveSet;
|
|
31
|
+
const isSetB = b instanceof RecursiveSet;
|
|
32
|
+
if (isSetA !== isSetB)
|
|
33
|
+
return isSetA ? 1 : -1;
|
|
34
|
+
// 3. Primitives
|
|
35
|
+
if (!isSetA) {
|
|
36
|
+
if (typeof a !== typeof b)
|
|
37
|
+
return typeof a > typeof b ? 1 : -1;
|
|
38
|
+
if (a < b)
|
|
39
|
+
return -1;
|
|
40
|
+
if (a > b)
|
|
41
|
+
return 1;
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
// 4. Recursive Sets
|
|
45
|
+
const sizeA = a.size;
|
|
46
|
+
const sizeB = b.size;
|
|
47
|
+
if (sizeA !== sizeB)
|
|
48
|
+
return sizeA < sizeB ? -1 : 1;
|
|
49
|
+
// Hash mismatch implies inequality (O(1))
|
|
50
|
+
if (a._hash !== b._hash)
|
|
51
|
+
return a._hash < b._hash ? -1 : 1;
|
|
52
|
+
// Deep structural comparison using internal iterators (low-level optimization)
|
|
53
|
+
let iterA = a._tree.begin;
|
|
54
|
+
let iterB = b._tree.begin;
|
|
55
|
+
while (iterA.valid && iterB.valid) {
|
|
56
|
+
const cmp = RecursiveSet.compare(iterA.key, iterB.key);
|
|
57
|
+
if (cmp !== 0)
|
|
58
|
+
return cmp;
|
|
59
|
+
iterA.next();
|
|
60
|
+
iterB.next();
|
|
33
61
|
}
|
|
34
|
-
if (a < b)
|
|
35
|
-
return -1;
|
|
36
|
-
if (a > b)
|
|
37
|
-
return 1;
|
|
38
62
|
return 0;
|
|
39
63
|
}
|
|
40
|
-
// 4. Recursive Sets
|
|
41
|
-
const sizeA = a.size;
|
|
42
|
-
const sizeB = b.size;
|
|
43
|
-
if (sizeA !== sizeB)
|
|
44
|
-
return sizeA < sizeB ? -1 : 1;
|
|
45
|
-
// Lexicographical comparison
|
|
46
|
-
const itA = a[Symbol.iterator]();
|
|
47
|
-
const itB = b[Symbol.iterator]();
|
|
48
|
-
let nextA = itA.next();
|
|
49
|
-
let nextB = itB.next();
|
|
50
|
-
while (!nextA.done) {
|
|
51
|
-
const cmp = compare(nextA.value, nextB.value);
|
|
52
|
-
if (cmp !== 0)
|
|
53
|
-
return cmp;
|
|
54
|
-
nextA = itA.next();
|
|
55
|
-
nextB = itB.next();
|
|
56
|
-
}
|
|
57
|
-
return 0;
|
|
58
|
-
}
|
|
59
|
-
class RecursiveSet {
|
|
60
|
-
// Red-Black Tree (immutable structure, we replace on mutation)
|
|
61
|
-
_tree; // Type from functional-red-black-tree
|
|
62
64
|
constructor(...elements) {
|
|
63
|
-
this._tree = (0, functional_red_black_tree_1.default)(compare);
|
|
65
|
+
this._tree = (0, functional_red_black_tree_1.default)(RecursiveSet.compare);
|
|
64
66
|
for (const el of elements) {
|
|
65
67
|
this.add(el);
|
|
66
68
|
}
|
|
@@ -68,59 +70,75 @@ class RecursiveSet {
|
|
|
68
70
|
// === Copy-on-Write Support ===
|
|
69
71
|
/**
|
|
70
72
|
* Creates a shallow copy of the set in O(1) time.
|
|
71
|
-
*
|
|
72
|
-
* this is extremely efficient (structural sharing).
|
|
73
|
+
* Leveraging the persistent nature of the underlying tree.
|
|
73
74
|
*/
|
|
74
75
|
clone() {
|
|
75
76
|
const clone = new RecursiveSet();
|
|
76
|
-
// We replace the empty tree directly with the reference to the current tree.
|
|
77
|
-
// Since the tree is persistent/immutable, this is safe and instant.
|
|
78
77
|
clone._tree = this._tree;
|
|
78
|
+
clone._hash = this._hash;
|
|
79
79
|
return clone;
|
|
80
80
|
}
|
|
81
81
|
// === Mutable Operations ===
|
|
82
82
|
add(element) {
|
|
83
|
-
// 0. Guard: Explicitly ban NaN
|
|
84
83
|
if (typeof element === "number" && Number.isNaN(element)) {
|
|
85
84
|
throw new Error("NaN is not supported as an element of RecursiveSet");
|
|
86
85
|
}
|
|
87
|
-
//
|
|
88
|
-
// Avoid duplicate inserts if the element is already present.
|
|
89
|
-
// This also mitigates race-condition-like issues with persistent tree structures during rapid mutations.
|
|
86
|
+
// Idempotency check prevents redundant hash updates and tree operations
|
|
90
87
|
if (this.has(element)) {
|
|
91
88
|
return this;
|
|
92
89
|
}
|
|
93
|
-
//
|
|
90
|
+
// Enforce Foundation Axiom (prevent cycles)
|
|
94
91
|
if (element instanceof RecursiveSet) {
|
|
95
92
|
if (this._wouldCreateCycle(element)) {
|
|
96
93
|
throw new Error("Foundation axiom violated: membership cycle detected");
|
|
97
94
|
}
|
|
98
95
|
}
|
|
99
|
-
//
|
|
96
|
+
// Update Hash (XOR)
|
|
97
|
+
this._hash = (this._hash ^ this._computeHash(element)) | 0;
|
|
98
|
+
// Insert into persistent tree
|
|
100
99
|
this._tree = this._tree.insert(element, true);
|
|
101
100
|
return this;
|
|
102
101
|
}
|
|
103
102
|
remove(element) {
|
|
103
|
+
if (!this.has(element)) {
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
// Update Hash (XOR removes the element from hash)
|
|
107
|
+
this._hash = (this._hash ^ this._computeHash(element)) | 0;
|
|
104
108
|
this._tree = this._tree.remove(element);
|
|
105
109
|
return this;
|
|
106
110
|
}
|
|
107
111
|
clear() {
|
|
108
|
-
this._tree = (0, functional_red_black_tree_1.default)(compare);
|
|
112
|
+
this._tree = (0, functional_red_black_tree_1.default)(RecursiveSet.compare);
|
|
113
|
+
this._hash = 0;
|
|
109
114
|
return this;
|
|
110
115
|
}
|
|
116
|
+
_computeHash(element) {
|
|
117
|
+
if (element instanceof RecursiveSet)
|
|
118
|
+
return element._hash;
|
|
119
|
+
if (typeof element === 'number')
|
|
120
|
+
return element | 0;
|
|
121
|
+
if (typeof element === 'string') {
|
|
122
|
+
let h = 0;
|
|
123
|
+
for (let i = 0; i < element.length; i++)
|
|
124
|
+
h = Math.imul(31, h) + element.charCodeAt(i) | 0;
|
|
125
|
+
return h;
|
|
126
|
+
}
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
111
129
|
// === Immutable Operations ===
|
|
112
130
|
union(other) {
|
|
113
|
-
const result =
|
|
114
|
-
for (const el of this)
|
|
115
|
-
result.add(el);
|
|
131
|
+
const result = this.clone(); // Optimization: Start with clone of this
|
|
116
132
|
for (const el of other)
|
|
117
133
|
result.add(el);
|
|
118
134
|
return result;
|
|
119
135
|
}
|
|
120
136
|
intersection(other) {
|
|
121
137
|
const result = new RecursiveSet();
|
|
122
|
-
|
|
123
|
-
|
|
138
|
+
// Iterate over smaller set for performance optimization
|
|
139
|
+
const [smaller, larger] = this.size < other.size ? [this, other] : [other, this];
|
|
140
|
+
for (const el of smaller) {
|
|
141
|
+
if (larger.has(el)) {
|
|
124
142
|
result.add(el);
|
|
125
143
|
}
|
|
126
144
|
}
|
|
@@ -136,13 +154,16 @@ class RecursiveSet {
|
|
|
136
154
|
return result;
|
|
137
155
|
}
|
|
138
156
|
symmetricDifference(other) {
|
|
139
|
-
|
|
157
|
+
// (A \ B) U (B \ A)
|
|
158
|
+
return this.difference(other).union(other.difference(this));
|
|
140
159
|
}
|
|
141
160
|
powerset() {
|
|
161
|
+
const n = this.size;
|
|
162
|
+
if (n > 30)
|
|
163
|
+
throw new Error("Powerset size exceeds 32-bit integer limit");
|
|
142
164
|
const elements = [];
|
|
143
165
|
this._tree.forEach((key) => { elements.push(key); return undefined; });
|
|
144
166
|
const subsets = [];
|
|
145
|
-
const n = elements.length;
|
|
146
167
|
for (let i = 0; i < (1 << n); i++) {
|
|
147
168
|
const subset = new RecursiveSet();
|
|
148
169
|
for (let j = 0; j < n; j++) {
|
|
@@ -160,6 +181,7 @@ class RecursiveSet {
|
|
|
160
181
|
for (const y of other) {
|
|
161
182
|
const valX = x;
|
|
162
183
|
const valY = y;
|
|
184
|
+
// Kuratowski pair: (x, y) = {{x}, {x, y}}
|
|
163
185
|
const pair = new RecursiveSet(new RecursiveSet(valX), new RecursiveSet(valX, valY));
|
|
164
186
|
pairs.push(pair);
|
|
165
187
|
}
|
|
@@ -171,6 +193,8 @@ class RecursiveSet {
|
|
|
171
193
|
return this._tree.get(element) !== undefined;
|
|
172
194
|
}
|
|
173
195
|
isSubset(other) {
|
|
196
|
+
if (this.size > other.size)
|
|
197
|
+
return false;
|
|
174
198
|
for (const el of this) {
|
|
175
199
|
if (!other.has(el))
|
|
176
200
|
return false;
|
|
@@ -187,7 +211,7 @@ class RecursiveSet {
|
|
|
187
211
|
return this.size === 0;
|
|
188
212
|
}
|
|
189
213
|
equals(other) {
|
|
190
|
-
return compare(this, other) === 0;
|
|
214
|
+
return RecursiveSet.compare(this, other) === 0;
|
|
191
215
|
}
|
|
192
216
|
// === Internals ===
|
|
193
217
|
_wouldCreateCycle(element) {
|
|
@@ -200,11 +224,13 @@ class RecursiveSet {
|
|
|
200
224
|
if (visited.has(current))
|
|
201
225
|
continue;
|
|
202
226
|
visited.add(current);
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
227
|
+
// Optimization: Direct internal tree traversal avoids iterator overhead
|
|
228
|
+
current._tree.forEach((key) => {
|
|
229
|
+
if (key instanceof RecursiveSet) {
|
|
230
|
+
stack.push(key);
|
|
206
231
|
}
|
|
207
|
-
|
|
232
|
+
return undefined;
|
|
233
|
+
});
|
|
208
234
|
}
|
|
209
235
|
return false;
|
|
210
236
|
}
|
|
@@ -217,10 +243,13 @@ class RecursiveSet {
|
|
|
217
243
|
this._tree.forEach((key) => { result.add(key); return undefined; });
|
|
218
244
|
return result;
|
|
219
245
|
}
|
|
246
|
+
// Lazy Iterator (Critical for performance)
|
|
220
247
|
*[Symbol.iterator]() {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
248
|
+
let iter = this._tree.begin;
|
|
249
|
+
while (iter.valid) {
|
|
250
|
+
yield iter.key;
|
|
251
|
+
iter.next();
|
|
252
|
+
}
|
|
224
253
|
}
|
|
225
254
|
toString() {
|
|
226
255
|
if (this.isEmpty())
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAmTA,4BAEC;AAED,8BAEC;AAED,oCAEC;AA7TD,0FAAmD;AAEnD;;;;GAIG;AACH,MAAa,YAAY;IACrB,uCAAuC;IAC/B,KAAK,CAAM;IACnB,qDAAqD;IAC7C,KAAK,GAAW,CAAC,CAAC;IAE1B;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,CAAM,EAAE,CAAM;QACzB,2BAA2B;QAC3B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEtB,qBAAqB;QACrB,MAAM,MAAM,GAAG,CAAC,YAAY,YAAY,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,YAAY,YAAY,CAAC;QACzC,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,gBAAgB;QAChB,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC;gBAAE,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,CAAC;YACpB,OAAO,CAAC,CAAC;QACb,CAAC;QAED,oBAAoB;QACpB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;QACrB,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,0CAA0C;QAC1C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,+EAA+E;QAC/E,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAE1B,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,GAAG,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;YAE1B,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,CAAC;IACb,CAAC;IAED,YAAY,GAAG,QAAoC;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAA,mCAAU,EAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE9C,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACL,CAAC;IAED,gCAAgC;IAEhC;;;OAGG;IACH,KAAK;QACD,MAAM,KAAK,GAAG,IAAI,YAAY,EAAK,CAAC;QACpC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,6BAA6B;IAE7B,GAAG,CAAC,OAA4B;QAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC1E,CAAC;QAED,wEAAwE;QACxE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,YAAY,YAAY,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;QAE3D,8BAA8B;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,OAA4B;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;QAE3D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,KAAK,GAAG,IAAA,mCAAU,EAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,YAAY,CAAC,OAAY;QAC7B,IAAI,OAAO,YAAY,YAAY;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC;QAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,OAAO,GAAG,CAAC,CAAC;QACpD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;gBACnC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,CAAC,CAAC;IACb,CAAC;IAED,+BAA+B;IAE/B,KAAK,CAAC,KAAsB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,yCAAyC;QACtE,KAAK,MAAM,EAAE,IAAI,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,KAAsB;QAC/B,MAAM,MAAM,GAAG,IAAI,YAAY,EAAK,CAAC;QACrC,wDAAwD;QACxD,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjF,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACvB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,KAAsB;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,EAAK,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,mBAAmB,CAAC,KAAsB;QACtC,oBAAoB;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ;QACJ,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAE1E,MAAM,QAAQ,GAA+B,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAK,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;YACL,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,YAAY,CAAkB,GAAG,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,gBAAgB,CAAI,KAAsB;QACtC,MAAM,KAAK,GAA0B,EAAE,CAAC;QAGxC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAG,CAAe,CAAC;gBAC7B,MAAM,IAAI,GAAG,CAAe,CAAC;gBAE7B,0CAA0C;gBAC1C,MAAM,IAAI,GAAG,IAAI,YAAY,CACzB,IAAI,YAAY,CAAQ,IAAI,CAAC,EAC7B,IAAI,YAAY,CAAQ,IAAI,EAAE,IAAI,CAAC,CACtC,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,YAAY,CAAsB,GAAG,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,qBAAqB;IAErB,GAAG,CAAC,OAA4B;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;IACjD,CAAC;IAED,QAAQ,CAAC,KAAsB;QAC3B,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACzC,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU,CAAC,KAAsB;QAC7B,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,KAAsB;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,KAAsB;QACzB,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,oBAAoB;IAEZ,iBAAiB,CAAC,OAAwB;QAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;QAExB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;YAC7B,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAElC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAS;YACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAErB,wEAAwE;YACxE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;gBAC/B,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;gBACD,OAAO,SAAS,CAAC;YACrB,CAAC,CAAC,CAAC;QACP,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,kBAAkB;IAElB,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,KAAK;QACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,2CAA2C;IAC3C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QACd,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,OAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,GAAG,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC;IACL,CAAC;IAED,QAAQ;QACJ,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,GAAG,CAAC;QAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YAC5B,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACJ,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACtC,CAAC;IAED,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;CACJ;AAxSD,oCAwSC;AAED,kBAAkB;AAElB,SAAgB,QAAQ;IACpB,OAAO,IAAI,YAAY,EAAK,CAAC;AACjC,CAAC;AAED,SAAgB,SAAS,CAAI,OAAU;IACnC,OAAO,IAAI,YAAY,CAAI,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,YAAY,CAAI,QAAqB;IACjD,OAAO,IAAI,YAAY,CAAI,GAAG,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,15 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module recursive-set
|
|
3
|
+
* A mutable recursive set implementation enforcing Cantor's ZFC axioms.
|
|
4
|
+
* Powered by functional Red-Black Trees for O(log n) operations and O(1) cloning.
|
|
5
|
+
*/
|
|
1
6
|
export declare class RecursiveSet<T = any> {
|
|
2
7
|
private _tree;
|
|
8
|
+
private _hash;
|
|
9
|
+
/**
|
|
10
|
+
* Static comparator for Red-Black Tree ordering.
|
|
11
|
+
* Handles primitives, RecursiveSets, and deep structural equality.
|
|
12
|
+
*/
|
|
13
|
+
static compare(a: any, b: any): number;
|
|
3
14
|
constructor(...elements: Array<T | RecursiveSet<T>>);
|
|
4
15
|
/**
|
|
5
16
|
* Creates a shallow copy of the set in O(1) time.
|
|
6
|
-
*
|
|
7
|
-
* this is extremely efficient (structural sharing).
|
|
17
|
+
* Leveraging the persistent nature of the underlying tree.
|
|
8
18
|
*/
|
|
9
19
|
clone(): RecursiveSet<T>;
|
|
10
20
|
add(element: T | RecursiveSet<T>): this;
|
|
11
21
|
remove(element: T | RecursiveSet<T>): this;
|
|
12
22
|
clear(): this;
|
|
23
|
+
private _computeHash;
|
|
13
24
|
union(other: RecursiveSet<T>): RecursiveSet<T>;
|
|
14
25
|
intersection(other: RecursiveSet<T>): RecursiveSet<T>;
|
|
15
26
|
difference(other: RecursiveSet<T>): RecursiveSet<T>;
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,YAAY,CAAC,CAAC,GAAG,GAAG;IAE7B,OAAO,CAAC,KAAK,CAAM;IAEnB,OAAO,CAAC,KAAK,CAAa;IAE1B;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM;gBAwC1B,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAUnD;;;OAGG;IACH,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;IASxB,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAyBvC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAY1C,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,YAAY;IAcpB,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAM9C,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAYrD,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAUnD,mBAAmB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAK5D,QAAQ,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAqBzC,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAsB9E,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO;IAI1C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO;IAQzC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO;IAI3C,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO;IAI/C,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO;IAMvC,OAAO,CAAC,iBAAiB;IAwBzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAOhC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAQnD,QAAQ,IAAI,MAAM;CAiBrB;AAID,wBAAgB,QAAQ,CAAC,CAAC,GAAG,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,CAEnD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAExD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAEtE"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,57 +1,59 @@
|
|
|
1
1
|
import createTree from 'functional-red-black-tree';
|
|
2
2
|
/**
|
|
3
3
|
* @module recursive-set
|
|
4
|
-
* A mutable recursive set implementation enforcing Cantor's ZFC axioms
|
|
5
|
-
* Powered by Red-Black Trees for O(log n) operations
|
|
4
|
+
* A mutable recursive set implementation enforcing Cantor's ZFC axioms.
|
|
5
|
+
* Powered by functional Red-Black Trees for O(log n) operations and O(1) cloning.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
7
|
+
export class RecursiveSet {
|
|
8
|
+
// Underlying persistent data structure
|
|
9
|
+
_tree;
|
|
10
|
+
// Internal XOR-based hash for O(1) inequality checks
|
|
11
|
+
_hash = 0;
|
|
12
|
+
/**
|
|
13
|
+
* Static comparator for Red-Black Tree ordering.
|
|
14
|
+
* Handles primitives, RecursiveSets, and deep structural equality.
|
|
15
|
+
*/
|
|
16
|
+
static compare(a, b) {
|
|
17
|
+
// 1. Identity optimization
|
|
18
|
+
if (a === b)
|
|
19
|
+
return 0;
|
|
20
|
+
// 2. Type separation
|
|
21
|
+
const isSetA = a instanceof RecursiveSet;
|
|
22
|
+
const isSetB = b instanceof RecursiveSet;
|
|
23
|
+
if (isSetA !== isSetB)
|
|
24
|
+
return isSetA ? 1 : -1;
|
|
25
|
+
// 3. Primitives
|
|
26
|
+
if (!isSetA) {
|
|
27
|
+
if (typeof a !== typeof b)
|
|
28
|
+
return typeof a > typeof b ? 1 : -1;
|
|
29
|
+
if (a < b)
|
|
30
|
+
return -1;
|
|
31
|
+
if (a > b)
|
|
32
|
+
return 1;
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
// 4. Recursive Sets
|
|
36
|
+
const sizeA = a.size;
|
|
37
|
+
const sizeB = b.size;
|
|
38
|
+
if (sizeA !== sizeB)
|
|
39
|
+
return sizeA < sizeB ? -1 : 1;
|
|
40
|
+
// Hash mismatch implies inequality (O(1))
|
|
41
|
+
if (a._hash !== b._hash)
|
|
42
|
+
return a._hash < b._hash ? -1 : 1;
|
|
43
|
+
// Deep structural comparison using internal iterators (low-level optimization)
|
|
44
|
+
let iterA = a._tree.begin;
|
|
45
|
+
let iterB = b._tree.begin;
|
|
46
|
+
while (iterA.valid && iterB.valid) {
|
|
47
|
+
const cmp = RecursiveSet.compare(iterA.key, iterB.key);
|
|
48
|
+
if (cmp !== 0)
|
|
49
|
+
return cmp;
|
|
50
|
+
iterA.next();
|
|
51
|
+
iterB.next();
|
|
24
52
|
}
|
|
25
|
-
if (a < b)
|
|
26
|
-
return -1;
|
|
27
|
-
if (a > b)
|
|
28
|
-
return 1;
|
|
29
53
|
return 0;
|
|
30
54
|
}
|
|
31
|
-
// 4. Recursive Sets
|
|
32
|
-
const sizeA = a.size;
|
|
33
|
-
const sizeB = b.size;
|
|
34
|
-
if (sizeA !== sizeB)
|
|
35
|
-
return sizeA < sizeB ? -1 : 1;
|
|
36
|
-
// Lexicographical comparison
|
|
37
|
-
const itA = a[Symbol.iterator]();
|
|
38
|
-
const itB = b[Symbol.iterator]();
|
|
39
|
-
let nextA = itA.next();
|
|
40
|
-
let nextB = itB.next();
|
|
41
|
-
while (!nextA.done) {
|
|
42
|
-
const cmp = compare(nextA.value, nextB.value);
|
|
43
|
-
if (cmp !== 0)
|
|
44
|
-
return cmp;
|
|
45
|
-
nextA = itA.next();
|
|
46
|
-
nextB = itB.next();
|
|
47
|
-
}
|
|
48
|
-
return 0;
|
|
49
|
-
}
|
|
50
|
-
export class RecursiveSet {
|
|
51
|
-
// Red-Black Tree (immutable structure, we replace on mutation)
|
|
52
|
-
_tree; // Type from functional-red-black-tree
|
|
53
55
|
constructor(...elements) {
|
|
54
|
-
this._tree = createTree(compare);
|
|
56
|
+
this._tree = createTree(RecursiveSet.compare);
|
|
55
57
|
for (const el of elements) {
|
|
56
58
|
this.add(el);
|
|
57
59
|
}
|
|
@@ -59,59 +61,75 @@ export class RecursiveSet {
|
|
|
59
61
|
// === Copy-on-Write Support ===
|
|
60
62
|
/**
|
|
61
63
|
* Creates a shallow copy of the set in O(1) time.
|
|
62
|
-
*
|
|
63
|
-
* this is extremely efficient (structural sharing).
|
|
64
|
+
* Leveraging the persistent nature of the underlying tree.
|
|
64
65
|
*/
|
|
65
66
|
clone() {
|
|
66
67
|
const clone = new RecursiveSet();
|
|
67
|
-
// We replace the empty tree directly with the reference to the current tree.
|
|
68
|
-
// Since the tree is persistent/immutable, this is safe and instant.
|
|
69
68
|
clone._tree = this._tree;
|
|
69
|
+
clone._hash = this._hash;
|
|
70
70
|
return clone;
|
|
71
71
|
}
|
|
72
72
|
// === Mutable Operations ===
|
|
73
73
|
add(element) {
|
|
74
|
-
// 0. Guard: Explicitly ban NaN
|
|
75
74
|
if (typeof element === "number" && Number.isNaN(element)) {
|
|
76
75
|
throw new Error("NaN is not supported as an element of RecursiveSet");
|
|
77
76
|
}
|
|
78
|
-
//
|
|
79
|
-
// Avoid duplicate inserts if the element is already present.
|
|
80
|
-
// This also mitigates race-condition-like issues with persistent tree structures during rapid mutations.
|
|
77
|
+
// Idempotency check prevents redundant hash updates and tree operations
|
|
81
78
|
if (this.has(element)) {
|
|
82
79
|
return this;
|
|
83
80
|
}
|
|
84
|
-
//
|
|
81
|
+
// Enforce Foundation Axiom (prevent cycles)
|
|
85
82
|
if (element instanceof RecursiveSet) {
|
|
86
83
|
if (this._wouldCreateCycle(element)) {
|
|
87
84
|
throw new Error("Foundation axiom violated: membership cycle detected");
|
|
88
85
|
}
|
|
89
86
|
}
|
|
90
|
-
//
|
|
87
|
+
// Update Hash (XOR)
|
|
88
|
+
this._hash = (this._hash ^ this._computeHash(element)) | 0;
|
|
89
|
+
// Insert into persistent tree
|
|
91
90
|
this._tree = this._tree.insert(element, true);
|
|
92
91
|
return this;
|
|
93
92
|
}
|
|
94
93
|
remove(element) {
|
|
94
|
+
if (!this.has(element)) {
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
// Update Hash (XOR removes the element from hash)
|
|
98
|
+
this._hash = (this._hash ^ this._computeHash(element)) | 0;
|
|
95
99
|
this._tree = this._tree.remove(element);
|
|
96
100
|
return this;
|
|
97
101
|
}
|
|
98
102
|
clear() {
|
|
99
|
-
this._tree = createTree(compare);
|
|
103
|
+
this._tree = createTree(RecursiveSet.compare);
|
|
104
|
+
this._hash = 0;
|
|
100
105
|
return this;
|
|
101
106
|
}
|
|
107
|
+
_computeHash(element) {
|
|
108
|
+
if (element instanceof RecursiveSet)
|
|
109
|
+
return element._hash;
|
|
110
|
+
if (typeof element === 'number')
|
|
111
|
+
return element | 0;
|
|
112
|
+
if (typeof element === 'string') {
|
|
113
|
+
let h = 0;
|
|
114
|
+
for (let i = 0; i < element.length; i++)
|
|
115
|
+
h = Math.imul(31, h) + element.charCodeAt(i) | 0;
|
|
116
|
+
return h;
|
|
117
|
+
}
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
102
120
|
// === Immutable Operations ===
|
|
103
121
|
union(other) {
|
|
104
|
-
const result =
|
|
105
|
-
for (const el of this)
|
|
106
|
-
result.add(el);
|
|
122
|
+
const result = this.clone(); // Optimization: Start with clone of this
|
|
107
123
|
for (const el of other)
|
|
108
124
|
result.add(el);
|
|
109
125
|
return result;
|
|
110
126
|
}
|
|
111
127
|
intersection(other) {
|
|
112
128
|
const result = new RecursiveSet();
|
|
113
|
-
|
|
114
|
-
|
|
129
|
+
// Iterate over smaller set for performance optimization
|
|
130
|
+
const [smaller, larger] = this.size < other.size ? [this, other] : [other, this];
|
|
131
|
+
for (const el of smaller) {
|
|
132
|
+
if (larger.has(el)) {
|
|
115
133
|
result.add(el);
|
|
116
134
|
}
|
|
117
135
|
}
|
|
@@ -127,13 +145,16 @@ export class RecursiveSet {
|
|
|
127
145
|
return result;
|
|
128
146
|
}
|
|
129
147
|
symmetricDifference(other) {
|
|
130
|
-
|
|
148
|
+
// (A \ B) U (B \ A)
|
|
149
|
+
return this.difference(other).union(other.difference(this));
|
|
131
150
|
}
|
|
132
151
|
powerset() {
|
|
152
|
+
const n = this.size;
|
|
153
|
+
if (n > 30)
|
|
154
|
+
throw new Error("Powerset size exceeds 32-bit integer limit");
|
|
133
155
|
const elements = [];
|
|
134
156
|
this._tree.forEach((key) => { elements.push(key); return undefined; });
|
|
135
157
|
const subsets = [];
|
|
136
|
-
const n = elements.length;
|
|
137
158
|
for (let i = 0; i < (1 << n); i++) {
|
|
138
159
|
const subset = new RecursiveSet();
|
|
139
160
|
for (let j = 0; j < n; j++) {
|
|
@@ -151,6 +172,7 @@ export class RecursiveSet {
|
|
|
151
172
|
for (const y of other) {
|
|
152
173
|
const valX = x;
|
|
153
174
|
const valY = y;
|
|
175
|
+
// Kuratowski pair: (x, y) = {{x}, {x, y}}
|
|
154
176
|
const pair = new RecursiveSet(new RecursiveSet(valX), new RecursiveSet(valX, valY));
|
|
155
177
|
pairs.push(pair);
|
|
156
178
|
}
|
|
@@ -162,6 +184,8 @@ export class RecursiveSet {
|
|
|
162
184
|
return this._tree.get(element) !== undefined;
|
|
163
185
|
}
|
|
164
186
|
isSubset(other) {
|
|
187
|
+
if (this.size > other.size)
|
|
188
|
+
return false;
|
|
165
189
|
for (const el of this) {
|
|
166
190
|
if (!other.has(el))
|
|
167
191
|
return false;
|
|
@@ -178,7 +202,7 @@ export class RecursiveSet {
|
|
|
178
202
|
return this.size === 0;
|
|
179
203
|
}
|
|
180
204
|
equals(other) {
|
|
181
|
-
return compare(this, other) === 0;
|
|
205
|
+
return RecursiveSet.compare(this, other) === 0;
|
|
182
206
|
}
|
|
183
207
|
// === Internals ===
|
|
184
208
|
_wouldCreateCycle(element) {
|
|
@@ -191,11 +215,13 @@ export class RecursiveSet {
|
|
|
191
215
|
if (visited.has(current))
|
|
192
216
|
continue;
|
|
193
217
|
visited.add(current);
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
218
|
+
// Optimization: Direct internal tree traversal avoids iterator overhead
|
|
219
|
+
current._tree.forEach((key) => {
|
|
220
|
+
if (key instanceof RecursiveSet) {
|
|
221
|
+
stack.push(key);
|
|
197
222
|
}
|
|
198
|
-
|
|
223
|
+
return undefined;
|
|
224
|
+
});
|
|
199
225
|
}
|
|
200
226
|
return false;
|
|
201
227
|
}
|
|
@@ -208,10 +234,13 @@ export class RecursiveSet {
|
|
|
208
234
|
this._tree.forEach((key) => { result.add(key); return undefined; });
|
|
209
235
|
return result;
|
|
210
236
|
}
|
|
237
|
+
// Lazy Iterator (Critical for performance)
|
|
211
238
|
*[Symbol.iterator]() {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
239
|
+
let iter = this._tree.begin;
|
|
240
|
+
while (iter.valid) {
|
|
241
|
+
yield iter.key;
|
|
242
|
+
iter.next();
|
|
243
|
+
}
|
|
215
244
|
}
|
|
216
245
|
toString() {
|
|
217
246
|
if (this.isEmpty())
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,2BAA2B,CAAC;AAEnD;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|