recursive-set 2.0.1 → 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/README.md +35 -52
- package/dist/cjs/index.js +120 -66
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.ts +17 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +120 -66
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,13 +11,14 @@ Supports arbitrary nesting, detects cycles (Foundation axiom), and includes all
|
|
|
11
11
|
|
|
12
12
|
## Features
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
**Mutable, recursive sets** with arbitrary depth
|
|
15
|
+
**Extensional equality** (two sets are equal iff their elements are equal)
|
|
16
|
+
**Cycle detection** (Foundation Axiom): prevents self-containing sets
|
|
17
|
+
**Copy-on-Write**: O(1) cloning via structural sharing
|
|
18
|
+
**Classic set operations**: union, intersection, difference, symmetric difference
|
|
19
|
+
**Power set and Cartesian product**
|
|
20
|
+
**TypeScript generics**: works with strings, numbers, objects, states, even sets of sets
|
|
21
|
+
**Ready for FSM**, mathematical, symbolic and practical use cases
|
|
21
22
|
|
|
22
23
|
---
|
|
23
24
|
|
|
@@ -29,26 +30,22 @@ This library enforces strict **ZFC Set Theory** semantics, differing from native
|
|
|
29
30
|
- Example: `new RecursiveSet(1).equals(new RecursiveSet(1))` is `true`.
|
|
30
31
|
- Native `Set` would treat them as distinct objects.
|
|
31
32
|
- **Foundation Axiom:** The library performs cycle detection to prevent sets from containing themselves (recursively).
|
|
33
|
+
- **NaN Handling:** In strict ZFC semantics, `NaN` is not a valid element. Adding `NaN` will explicitly throw an error.
|
|
32
34
|
- **Performance:** Internally powered by **Functional Red-Black Trees** (via `functional-red-black-tree`).
|
|
33
35
|
- Operations like insertion, deletion, and lookup are **O(log n)**.
|
|
34
|
-
-
|
|
36
|
+
- **Cloning is O(1)** (Copy-on-Write), making it ideal for backtracking algorithms.
|
|
35
37
|
|
|
36
38
|
---
|
|
37
39
|
|
|
38
40
|
## Installation
|
|
39
41
|
|
|
40
42
|
```
|
|
41
|
-
|
|
42
43
|
npm install recursive-set
|
|
43
|
-
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
---
|
|
47
|
-
|
|
48
47
|
## Quickstart
|
|
49
|
-
|
|
50
48
|
```
|
|
51
|
-
|
|
52
49
|
import { RecursiveSet } from "recursive-set";
|
|
53
50
|
|
|
54
51
|
const q0 = "q0", q1 = "q1";
|
|
@@ -58,7 +55,6 @@ const classes = new RecursiveSet(eqClass);
|
|
|
58
55
|
classes.add(new RecursiveSet("q2", "q3")); // {{q0, q1}, {q2, q3}}
|
|
59
56
|
|
|
60
57
|
console.log(classes.toString()); // {{q0, q1}, {q2, q3}}
|
|
61
|
-
|
|
62
58
|
```
|
|
63
59
|
|
|
64
60
|
---
|
|
@@ -68,18 +64,19 @@ console.log(classes.toString()); // {{q0, q1}, {q2, q3}}
|
|
|
68
64
|
### Constructor
|
|
69
65
|
|
|
70
66
|
```
|
|
71
|
-
|
|
72
67
|
new RecursiveSet<T>(...elements: Array<T | RecursiveSet<T>>)
|
|
73
|
-
|
|
74
68
|
```
|
|
75
69
|
|
|
76
70
|
### Methods
|
|
77
71
|
|
|
78
72
|
**Mutation:**
|
|
79
|
-
- `add(element: T | RecursiveSet<T>): this` – Add element (chainable)
|
|
73
|
+
- `add(element: T | RecursiveSet<T>): this` – Add element (chainable). **Throws if element is NaN.**
|
|
80
74
|
- `remove(element: T | RecursiveSet<T>): this` – Remove element (chainable)
|
|
81
75
|
- `clear(): this` – Remove all elements (chainable)
|
|
82
76
|
|
|
77
|
+
**Snapshot:**
|
|
78
|
+
- `clone(): RecursiveSet<T>` – Creates a shallow copy in **O(1)** time (Copy-on-Write).
|
|
79
|
+
|
|
83
80
|
**Set Operations:**
|
|
84
81
|
- `union(other: RecursiveSet<T>): RecursiveSet<T>` – A ∪ B
|
|
85
82
|
- `intersection(other: RecursiveSet<T>): RecursiveSet<T>` – A ∩ B
|
|
@@ -108,63 +105,55 @@ new RecursiveSet<T>(...elements: Array<T | RecursiveSet<T>>)
|
|
|
108
105
|
### Basic Usage
|
|
109
106
|
|
|
110
107
|
```
|
|
111
|
-
|
|
112
108
|
const s1 = new RecursiveSet(1, 2, 3);
|
|
113
109
|
const s2 = new RecursiveSet(2, 3, 4);
|
|
114
110
|
|
|
115
111
|
console.log(s1.union(s2)); // {1, 2, 3, 4}
|
|
116
112
|
console.log(s1.intersection(s2)); // {2, 3}
|
|
117
113
|
console.log(s1.difference(s2)); // {1}
|
|
118
|
-
|
|
119
114
|
```
|
|
120
115
|
|
|
121
|
-
###
|
|
116
|
+
### Backtracking with O(1) Clone
|
|
122
117
|
|
|
123
118
|
```
|
|
119
|
+
const state = new RecursiveSet("init");
|
|
120
|
+
// ... perform some operations ...
|
|
124
121
|
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
const eqClasses = new RecursiveSet(eq1, eq2);
|
|
128
|
-
|
|
129
|
-
console.log(eqClasses.toString()); // {{q0, q1}, {q2, q3}}
|
|
122
|
+
// Create a checkpoint (O(1))
|
|
123
|
+
const checkpoint = state.clone();
|
|
130
124
|
|
|
125
|
+
state.add("newState");
|
|
126
|
+
// If this path fails, simply revert:
|
|
127
|
+
// state = checkpoint; (conceptually)
|
|
131
128
|
```
|
|
132
129
|
|
|
133
130
|
### Power Set
|
|
134
131
|
|
|
135
132
|
```
|
|
136
|
-
|
|
137
133
|
const set = new RecursiveSet(1, 2);
|
|
138
134
|
const power = set.powerset();
|
|
139
135
|
|
|
140
136
|
console.log(power.toString()); // {∅, {1}, {2}, {1, 2}}
|
|
141
|
-
|
|
142
137
|
```
|
|
143
138
|
|
|
144
|
-
###
|
|
139
|
+
### Strictness: NaN and Cycles
|
|
145
140
|
|
|
146
141
|
```
|
|
147
|
-
|
|
148
142
|
const s = new RecursiveSet(1, 2);
|
|
143
|
+
|
|
144
|
+
// Cycle Detection
|
|
149
145
|
try {
|
|
150
|
-
s.add(s);
|
|
146
|
+
s.add(s);
|
|
151
147
|
} catch (e) {
|
|
152
148
|
console.error(e.message); // "Foundation axiom violated..."
|
|
153
149
|
}
|
|
154
150
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const set = new RecursiveSet(1, 2)
|
|
162
|
-
.add(3)
|
|
163
|
-
.add(4)
|
|
164
|
-
.remove(1);
|
|
165
|
-
|
|
166
|
-
console.log(set); // {2, 3, 4}
|
|
167
|
-
|
|
151
|
+
// NaN Rejection
|
|
152
|
+
try {
|
|
153
|
+
s.add(NaN);
|
|
154
|
+
} catch (e) {
|
|
155
|
+
console.error(e.message); // "NaN is not supported..."
|
|
156
|
+
}
|
|
168
157
|
```
|
|
169
158
|
|
|
170
159
|
---
|
|
@@ -182,25 +171,18 @@ console.log(set); // {2, 3, 4}
|
|
|
182
171
|
## Development
|
|
183
172
|
|
|
184
173
|
```
|
|
185
|
-
|
|
186
|
-
|
|
187
174
|
# Clone repository
|
|
188
|
-
|
|
189
|
-
git clone https://github.com/<USERNAME>/recursive-set.git
|
|
175
|
+
git clone https://github.com/cstrerath/recursive-set.git
|
|
190
176
|
cd recursive-set
|
|
191
177
|
|
|
192
178
|
# Install dependencies
|
|
193
|
-
|
|
194
179
|
npm install
|
|
195
180
|
|
|
196
181
|
# Build
|
|
197
|
-
|
|
198
182
|
npm run build
|
|
199
183
|
|
|
200
184
|
# Run tests
|
|
201
|
-
|
|
202
185
|
npx tsx test.ts
|
|
203
|
-
|
|
204
186
|
```
|
|
205
187
|
|
|
206
188
|
---
|
|
@@ -225,4 +207,5 @@ See [LICENSE](LICENSE) for details.
|
|
|
225
207
|
Inspired by:
|
|
226
208
|
- Cantor's set theory
|
|
227
209
|
- Zermelo-Fraenkel set theory with the Axiom of Choice (ZFC)
|
|
228
|
-
- Practical needs in FSM algorithms and formal language theory
|
|
210
|
+
- Practical needs in FSM algorithms and formal language theory
|
|
211
|
+
- Powered by [functional-red-black-tree](https://github.com/mikolalysenko/functional-red-black-tree) for O(log n) persistence
|
package/dist/cjs/index.js
CHANGED
|
@@ -10,92 +10,135 @@ 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
|
-
* Comparator function for ZFC sets
|
|
18
|
-
* Returns -1 if a < b, 1 if a > b, 0 if a == b (structural equality)
|
|
19
|
-
*/
|
|
20
|
-
function compare(a, b) {
|
|
21
|
-
// 1. Identity optimization
|
|
22
|
-
if (a === b)
|
|
23
|
-
return 0;
|
|
24
|
-
// 2. Type separation: Sets are "greater" than primitives
|
|
25
|
-
const isSetA = a instanceof RecursiveSet;
|
|
26
|
-
const isSetB = b instanceof RecursiveSet;
|
|
27
|
-
if (isSetA !== isSetB)
|
|
28
|
-
return isSetA ? 1 : -1;
|
|
29
|
-
// 3. Primitives
|
|
30
|
-
if (!isSetA) {
|
|
31
|
-
if (typeof a !== typeof b) {
|
|
32
|
-
return typeof a > typeof b ? 1 : -1;
|
|
33
|
-
}
|
|
34
|
-
return a < b ? -1 : 1;
|
|
35
|
-
}
|
|
36
|
-
// 4. Recursive Sets
|
|
37
|
-
const sizeA = a.size;
|
|
38
|
-
const sizeB = b.size;
|
|
39
|
-
if (sizeA !== sizeB)
|
|
40
|
-
return sizeA < sizeB ? -1 : 1;
|
|
41
|
-
// Lexicographical comparison
|
|
42
|
-
const itA = a[Symbol.iterator]();
|
|
43
|
-
const itB = b[Symbol.iterator]();
|
|
44
|
-
let nextA = itA.next();
|
|
45
|
-
let nextB = itB.next();
|
|
46
|
-
while (!nextA.done) {
|
|
47
|
-
const cmp = compare(nextA.value, nextB.value);
|
|
48
|
-
if (cmp !== 0)
|
|
49
|
-
return cmp;
|
|
50
|
-
nextA = itA.next();
|
|
51
|
-
nextB = itB.next();
|
|
52
|
-
}
|
|
53
|
-
return 0;
|
|
54
|
-
}
|
|
55
16
|
class RecursiveSet {
|
|
56
|
-
//
|
|
57
|
-
_tree;
|
|
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();
|
|
61
|
+
}
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
58
64
|
constructor(...elements) {
|
|
59
|
-
this._tree = (0, functional_red_black_tree_1.default)(compare);
|
|
65
|
+
this._tree = (0, functional_red_black_tree_1.default)(RecursiveSet.compare);
|
|
60
66
|
for (const el of elements) {
|
|
61
67
|
this.add(el);
|
|
62
68
|
}
|
|
63
69
|
}
|
|
70
|
+
// === Copy-on-Write Support ===
|
|
71
|
+
/**
|
|
72
|
+
* Creates a shallow copy of the set in O(1) time.
|
|
73
|
+
* Leveraging the persistent nature of the underlying tree.
|
|
74
|
+
*/
|
|
75
|
+
clone() {
|
|
76
|
+
const clone = new RecursiveSet();
|
|
77
|
+
clone._tree = this._tree;
|
|
78
|
+
clone._hash = this._hash;
|
|
79
|
+
return clone;
|
|
80
|
+
}
|
|
64
81
|
// === Mutable Operations ===
|
|
65
82
|
add(element) {
|
|
83
|
+
if (typeof element === "number" && Number.isNaN(element)) {
|
|
84
|
+
throw new Error("NaN is not supported as an element of RecursiveSet");
|
|
85
|
+
}
|
|
86
|
+
// Idempotency check prevents redundant hash updates and tree operations
|
|
87
|
+
if (this.has(element)) {
|
|
88
|
+
return this;
|
|
89
|
+
}
|
|
90
|
+
// Enforce Foundation Axiom (prevent cycles)
|
|
66
91
|
if (element instanceof RecursiveSet) {
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
throw new Error("Foundation axiom violated: membership cycle detected");
|
|
70
|
-
}
|
|
92
|
+
if (this._wouldCreateCycle(element)) {
|
|
93
|
+
throw new Error("Foundation axiom violated: membership cycle detected");
|
|
71
94
|
}
|
|
72
95
|
}
|
|
73
|
-
//
|
|
74
|
-
|
|
96
|
+
// Update Hash (XOR)
|
|
97
|
+
this._hash = (this._hash ^ this._computeHash(element)) | 0;
|
|
98
|
+
// Insert into persistent tree
|
|
75
99
|
this._tree = this._tree.insert(element, true);
|
|
76
100
|
return this;
|
|
77
101
|
}
|
|
78
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;
|
|
79
108
|
this._tree = this._tree.remove(element);
|
|
80
109
|
return this;
|
|
81
110
|
}
|
|
82
111
|
clear() {
|
|
83
|
-
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;
|
|
84
114
|
return this;
|
|
85
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
|
+
}
|
|
86
129
|
// === Immutable Operations ===
|
|
87
130
|
union(other) {
|
|
88
|
-
const result =
|
|
89
|
-
for (const el of this)
|
|
90
|
-
result.add(el);
|
|
131
|
+
const result = this.clone(); // Optimization: Start with clone of this
|
|
91
132
|
for (const el of other)
|
|
92
133
|
result.add(el);
|
|
93
134
|
return result;
|
|
94
135
|
}
|
|
95
136
|
intersection(other) {
|
|
96
137
|
const result = new RecursiveSet();
|
|
97
|
-
|
|
98
|
-
|
|
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)) {
|
|
99
142
|
result.add(el);
|
|
100
143
|
}
|
|
101
144
|
}
|
|
@@ -111,13 +154,16 @@ class RecursiveSet {
|
|
|
111
154
|
return result;
|
|
112
155
|
}
|
|
113
156
|
symmetricDifference(other) {
|
|
114
|
-
|
|
157
|
+
// (A \ B) U (B \ A)
|
|
158
|
+
return this.difference(other).union(other.difference(this));
|
|
115
159
|
}
|
|
116
160
|
powerset() {
|
|
161
|
+
const n = this.size;
|
|
162
|
+
if (n > 30)
|
|
163
|
+
throw new Error("Powerset size exceeds 32-bit integer limit");
|
|
117
164
|
const elements = [];
|
|
118
165
|
this._tree.forEach((key) => { elements.push(key); return undefined; });
|
|
119
166
|
const subsets = [];
|
|
120
|
-
const n = elements.length;
|
|
121
167
|
for (let i = 0; i < (1 << n); i++) {
|
|
122
168
|
const subset = new RecursiveSet();
|
|
123
169
|
for (let j = 0; j < n; j++) {
|
|
@@ -135,6 +181,7 @@ class RecursiveSet {
|
|
|
135
181
|
for (const y of other) {
|
|
136
182
|
const valX = x;
|
|
137
183
|
const valY = y;
|
|
184
|
+
// Kuratowski pair: (x, y) = {{x}, {x, y}}
|
|
138
185
|
const pair = new RecursiveSet(new RecursiveSet(valX), new RecursiveSet(valX, valY));
|
|
139
186
|
pairs.push(pair);
|
|
140
187
|
}
|
|
@@ -146,6 +193,8 @@ class RecursiveSet {
|
|
|
146
193
|
return this._tree.get(element) !== undefined;
|
|
147
194
|
}
|
|
148
195
|
isSubset(other) {
|
|
196
|
+
if (this.size > other.size)
|
|
197
|
+
return false;
|
|
149
198
|
for (const el of this) {
|
|
150
199
|
if (!other.has(el))
|
|
151
200
|
return false;
|
|
@@ -162,7 +211,7 @@ class RecursiveSet {
|
|
|
162
211
|
return this.size === 0;
|
|
163
212
|
}
|
|
164
213
|
equals(other) {
|
|
165
|
-
return compare(this, other) === 0;
|
|
214
|
+
return RecursiveSet.compare(this, other) === 0;
|
|
166
215
|
}
|
|
167
216
|
// === Internals ===
|
|
168
217
|
_wouldCreateCycle(element) {
|
|
@@ -175,11 +224,13 @@ class RecursiveSet {
|
|
|
175
224
|
if (visited.has(current))
|
|
176
225
|
continue;
|
|
177
226
|
visited.add(current);
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
227
|
+
// Optimization: Direct internal tree traversal avoids iterator overhead
|
|
228
|
+
current._tree.forEach((key) => {
|
|
229
|
+
if (key instanceof RecursiveSet) {
|
|
230
|
+
stack.push(key);
|
|
181
231
|
}
|
|
182
|
-
|
|
232
|
+
return undefined;
|
|
233
|
+
});
|
|
183
234
|
}
|
|
184
235
|
return false;
|
|
185
236
|
}
|
|
@@ -192,10 +243,13 @@ class RecursiveSet {
|
|
|
192
243
|
this._tree.forEach((key) => { result.add(key); return undefined; });
|
|
193
244
|
return result;
|
|
194
245
|
}
|
|
246
|
+
// Lazy Iterator (Critical for performance)
|
|
195
247
|
*[Symbol.iterator]() {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
248
|
+
let iter = this._tree.begin;
|
|
249
|
+
while (iter.valid) {
|
|
250
|
+
yield iter.key;
|
|
251
|
+
iter.next();
|
|
252
|
+
}
|
|
199
253
|
}
|
|
200
254
|
toString() {
|
|
201
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":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,9 +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>>);
|
|
15
|
+
/**
|
|
16
|
+
* Creates a shallow copy of the set in O(1) time.
|
|
17
|
+
* Leveraging the persistent nature of the underlying tree.
|
|
18
|
+
*/
|
|
19
|
+
clone(): RecursiveSet<T>;
|
|
4
20
|
add(element: T | RecursiveSet<T>): this;
|
|
5
21
|
remove(element: T | RecursiveSet<T>): this;
|
|
6
22
|
clear(): this;
|
|
23
|
+
private _computeHash;
|
|
7
24
|
union(other: RecursiveSet<T>): RecursiveSet<T>;
|
|
8
25
|
intersection(other: RecursiveSet<T>): RecursiveSet<T>;
|
|
9
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,92 +1,135 @@
|
|
|
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
|
-
* Comparator function for ZFC sets
|
|
9
|
-
* Returns -1 if a < b, 1 if a > b, 0 if a == b (structural equality)
|
|
10
|
-
*/
|
|
11
|
-
function compare(a, b) {
|
|
12
|
-
// 1. Identity optimization
|
|
13
|
-
if (a === b)
|
|
14
|
-
return 0;
|
|
15
|
-
// 2. Type separation: Sets are "greater" than primitives
|
|
16
|
-
const isSetA = a instanceof RecursiveSet;
|
|
17
|
-
const isSetB = b instanceof RecursiveSet;
|
|
18
|
-
if (isSetA !== isSetB)
|
|
19
|
-
return isSetA ? 1 : -1;
|
|
20
|
-
// 3. Primitives
|
|
21
|
-
if (!isSetA) {
|
|
22
|
-
if (typeof a !== typeof b) {
|
|
23
|
-
return typeof a > typeof b ? 1 : -1;
|
|
24
|
-
}
|
|
25
|
-
return a < b ? -1 : 1;
|
|
26
|
-
}
|
|
27
|
-
// 4. Recursive Sets
|
|
28
|
-
const sizeA = a.size;
|
|
29
|
-
const sizeB = b.size;
|
|
30
|
-
if (sizeA !== sizeB)
|
|
31
|
-
return sizeA < sizeB ? -1 : 1;
|
|
32
|
-
// Lexicographical comparison
|
|
33
|
-
const itA = a[Symbol.iterator]();
|
|
34
|
-
const itB = b[Symbol.iterator]();
|
|
35
|
-
let nextA = itA.next();
|
|
36
|
-
let nextB = itB.next();
|
|
37
|
-
while (!nextA.done) {
|
|
38
|
-
const cmp = compare(nextA.value, nextB.value);
|
|
39
|
-
if (cmp !== 0)
|
|
40
|
-
return cmp;
|
|
41
|
-
nextA = itA.next();
|
|
42
|
-
nextB = itB.next();
|
|
43
|
-
}
|
|
44
|
-
return 0;
|
|
45
|
-
}
|
|
46
7
|
export class RecursiveSet {
|
|
47
|
-
//
|
|
48
|
-
_tree;
|
|
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();
|
|
52
|
+
}
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
49
55
|
constructor(...elements) {
|
|
50
|
-
this._tree = createTree(compare);
|
|
56
|
+
this._tree = createTree(RecursiveSet.compare);
|
|
51
57
|
for (const el of elements) {
|
|
52
58
|
this.add(el);
|
|
53
59
|
}
|
|
54
60
|
}
|
|
61
|
+
// === Copy-on-Write Support ===
|
|
62
|
+
/**
|
|
63
|
+
* Creates a shallow copy of the set in O(1) time.
|
|
64
|
+
* Leveraging the persistent nature of the underlying tree.
|
|
65
|
+
*/
|
|
66
|
+
clone() {
|
|
67
|
+
const clone = new RecursiveSet();
|
|
68
|
+
clone._tree = this._tree;
|
|
69
|
+
clone._hash = this._hash;
|
|
70
|
+
return clone;
|
|
71
|
+
}
|
|
55
72
|
// === Mutable Operations ===
|
|
56
73
|
add(element) {
|
|
74
|
+
if (typeof element === "number" && Number.isNaN(element)) {
|
|
75
|
+
throw new Error("NaN is not supported as an element of RecursiveSet");
|
|
76
|
+
}
|
|
77
|
+
// Idempotency check prevents redundant hash updates and tree operations
|
|
78
|
+
if (this.has(element)) {
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
// Enforce Foundation Axiom (prevent cycles)
|
|
57
82
|
if (element instanceof RecursiveSet) {
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
throw new Error("Foundation axiom violated: membership cycle detected");
|
|
61
|
-
}
|
|
83
|
+
if (this._wouldCreateCycle(element)) {
|
|
84
|
+
throw new Error("Foundation axiom violated: membership cycle detected");
|
|
62
85
|
}
|
|
63
86
|
}
|
|
64
|
-
//
|
|
65
|
-
|
|
87
|
+
// Update Hash (XOR)
|
|
88
|
+
this._hash = (this._hash ^ this._computeHash(element)) | 0;
|
|
89
|
+
// Insert into persistent tree
|
|
66
90
|
this._tree = this._tree.insert(element, true);
|
|
67
91
|
return this;
|
|
68
92
|
}
|
|
69
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;
|
|
70
99
|
this._tree = this._tree.remove(element);
|
|
71
100
|
return this;
|
|
72
101
|
}
|
|
73
102
|
clear() {
|
|
74
|
-
this._tree = createTree(compare);
|
|
103
|
+
this._tree = createTree(RecursiveSet.compare);
|
|
104
|
+
this._hash = 0;
|
|
75
105
|
return this;
|
|
76
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
|
+
}
|
|
77
120
|
// === Immutable Operations ===
|
|
78
121
|
union(other) {
|
|
79
|
-
const result =
|
|
80
|
-
for (const el of this)
|
|
81
|
-
result.add(el);
|
|
122
|
+
const result = this.clone(); // Optimization: Start with clone of this
|
|
82
123
|
for (const el of other)
|
|
83
124
|
result.add(el);
|
|
84
125
|
return result;
|
|
85
126
|
}
|
|
86
127
|
intersection(other) {
|
|
87
128
|
const result = new RecursiveSet();
|
|
88
|
-
|
|
89
|
-
|
|
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)) {
|
|
90
133
|
result.add(el);
|
|
91
134
|
}
|
|
92
135
|
}
|
|
@@ -102,13 +145,16 @@ export class RecursiveSet {
|
|
|
102
145
|
return result;
|
|
103
146
|
}
|
|
104
147
|
symmetricDifference(other) {
|
|
105
|
-
|
|
148
|
+
// (A \ B) U (B \ A)
|
|
149
|
+
return this.difference(other).union(other.difference(this));
|
|
106
150
|
}
|
|
107
151
|
powerset() {
|
|
152
|
+
const n = this.size;
|
|
153
|
+
if (n > 30)
|
|
154
|
+
throw new Error("Powerset size exceeds 32-bit integer limit");
|
|
108
155
|
const elements = [];
|
|
109
156
|
this._tree.forEach((key) => { elements.push(key); return undefined; });
|
|
110
157
|
const subsets = [];
|
|
111
|
-
const n = elements.length;
|
|
112
158
|
for (let i = 0; i < (1 << n); i++) {
|
|
113
159
|
const subset = new RecursiveSet();
|
|
114
160
|
for (let j = 0; j < n; j++) {
|
|
@@ -126,6 +172,7 @@ export class RecursiveSet {
|
|
|
126
172
|
for (const y of other) {
|
|
127
173
|
const valX = x;
|
|
128
174
|
const valY = y;
|
|
175
|
+
// Kuratowski pair: (x, y) = {{x}, {x, y}}
|
|
129
176
|
const pair = new RecursiveSet(new RecursiveSet(valX), new RecursiveSet(valX, valY));
|
|
130
177
|
pairs.push(pair);
|
|
131
178
|
}
|
|
@@ -137,6 +184,8 @@ export class RecursiveSet {
|
|
|
137
184
|
return this._tree.get(element) !== undefined;
|
|
138
185
|
}
|
|
139
186
|
isSubset(other) {
|
|
187
|
+
if (this.size > other.size)
|
|
188
|
+
return false;
|
|
140
189
|
for (const el of this) {
|
|
141
190
|
if (!other.has(el))
|
|
142
191
|
return false;
|
|
@@ -153,7 +202,7 @@ export class RecursiveSet {
|
|
|
153
202
|
return this.size === 0;
|
|
154
203
|
}
|
|
155
204
|
equals(other) {
|
|
156
|
-
return compare(this, other) === 0;
|
|
205
|
+
return RecursiveSet.compare(this, other) === 0;
|
|
157
206
|
}
|
|
158
207
|
// === Internals ===
|
|
159
208
|
_wouldCreateCycle(element) {
|
|
@@ -166,11 +215,13 @@ export class RecursiveSet {
|
|
|
166
215
|
if (visited.has(current))
|
|
167
216
|
continue;
|
|
168
217
|
visited.add(current);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
218
|
+
// Optimization: Direct internal tree traversal avoids iterator overhead
|
|
219
|
+
current._tree.forEach((key) => {
|
|
220
|
+
if (key instanceof RecursiveSet) {
|
|
221
|
+
stack.push(key);
|
|
172
222
|
}
|
|
173
|
-
|
|
223
|
+
return undefined;
|
|
224
|
+
});
|
|
174
225
|
}
|
|
175
226
|
return false;
|
|
176
227
|
}
|
|
@@ -183,10 +234,13 @@ export class RecursiveSet {
|
|
|
183
234
|
this._tree.forEach((key) => { result.add(key); return undefined; });
|
|
184
235
|
return result;
|
|
185
236
|
}
|
|
237
|
+
// Lazy Iterator (Critical for performance)
|
|
186
238
|
*[Symbol.iterator]() {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
239
|
+
let iter = this._tree.begin;
|
|
240
|
+
while (iter.valid) {
|
|
241
|
+
yield iter.key;
|
|
242
|
+
iter.next();
|
|
243
|
+
}
|
|
190
244
|
}
|
|
191
245
|
toString() {
|
|
192
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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"}
|