@isograph/reference-counted-pointer 0.0.0-main-c88a0561 → 0.0.0-main-f49c67bb
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/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@isograph/reference-counted-pointer",
|
3
|
-
"version": "0.0.0-main-
|
3
|
+
"version": "0.0.0-main-f49c67bb",
|
4
4
|
"description": "Reference counted pointers enable sharing of disposable items.",
|
5
5
|
"main": "dist/index.js",
|
6
6
|
"types": "dist/index.d.ts",
|
@@ -14,7 +14,7 @@
|
|
14
14
|
"coverage": "vitest run --coverage"
|
15
15
|
},
|
16
16
|
"dependencies": {
|
17
|
-
"@isograph/disposable-types": "0.0.0-main-
|
17
|
+
"@isograph/disposable-types": "0.0.0-main-f49c67bb",
|
18
18
|
"react": "^18.2.0"
|
19
19
|
},
|
20
20
|
"devDependencies": {
|
@@ -5,7 +5,10 @@ describe('createReferenceCountedPointer', () => {
|
|
5
5
|
describe('it should not dispose the underlying item until all outstanding pointers are disposed', () => {
|
6
6
|
test('one pointer', () => {
|
7
7
|
const disposeItem = vi.fn();
|
8
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
8
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
9
|
+
1,
|
10
|
+
disposeItem,
|
11
|
+
]);
|
9
12
|
expect(disposeItem).not.toHaveBeenCalled();
|
10
13
|
disposePointer();
|
11
14
|
expect(disposeItem).toHaveBeenCalled();
|
@@ -13,7 +16,10 @@ describe('createReferenceCountedPointer', () => {
|
|
13
16
|
|
14
17
|
test('linked list, FIFO', () => {
|
15
18
|
const disposeItem = vi.fn();
|
16
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
19
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
20
|
+
1,
|
21
|
+
disposeItem,
|
22
|
+
]);
|
17
23
|
const [pointer2, disposePointer2] = pointer.cloneIfNotDisposed()!;
|
18
24
|
const [pointer3, disposePointer3] = pointer2.cloneIfNotDisposed()!;
|
19
25
|
const [pointer4, disposePointer4] = pointer3.cloneIfNotDisposed()!;
|
@@ -28,7 +34,10 @@ describe('createReferenceCountedPointer', () => {
|
|
28
34
|
|
29
35
|
test('linked list, LIFO', () => {
|
30
36
|
const disposeItem = vi.fn();
|
31
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
37
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
38
|
+
1,
|
39
|
+
disposeItem,
|
40
|
+
]);
|
32
41
|
const [pointer2, disposePointer2] = pointer.cloneIfNotDisposed()!;
|
33
42
|
const [pointer3, disposePointer3] = pointer2.cloneIfNotDisposed()!;
|
34
43
|
const [pointer4, disposePointer4] = pointer3.cloneIfNotDisposed()!;
|
@@ -43,7 +52,10 @@ describe('createReferenceCountedPointer', () => {
|
|
43
52
|
|
44
53
|
test('linked list, mixed order', () => {
|
45
54
|
const disposeItem = vi.fn();
|
46
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
55
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
56
|
+
1,
|
57
|
+
disposeItem,
|
58
|
+
]);
|
47
59
|
const [pointer2, disposePointer2] = pointer.cloneIfNotDisposed()!;
|
48
60
|
const [pointer3, disposePointer3] = pointer2.cloneIfNotDisposed()!;
|
49
61
|
const [pointer4, disposePointer4] = pointer3.cloneIfNotDisposed()!;
|
@@ -58,7 +70,10 @@ describe('createReferenceCountedPointer', () => {
|
|
58
70
|
|
59
71
|
test('DAG, from root', () => {
|
60
72
|
const disposeItem = vi.fn();
|
61
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
73
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
74
|
+
1,
|
75
|
+
disposeItem,
|
76
|
+
]);
|
62
77
|
const [pointerA, disposePointerA] = pointer.cloneIfNotDisposed()!;
|
63
78
|
const [pointerA_1, disposePointerA_1] = pointerA.cloneIfNotDisposed()!;
|
64
79
|
const [pointerA_2, disposePointerA_2] = pointerA.cloneIfNotDisposed()!;
|
@@ -79,7 +94,10 @@ describe('createReferenceCountedPointer', () => {
|
|
79
94
|
|
80
95
|
test('DAG, from leaves', () => {
|
81
96
|
const disposeItem = vi.fn();
|
82
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
97
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
98
|
+
1,
|
99
|
+
disposeItem,
|
100
|
+
]);
|
83
101
|
const [pointerA, disposePointerA] = pointer.cloneIfNotDisposed()!;
|
84
102
|
const [pointerA_1, disposePointerA_1] = pointerA.cloneIfNotDisposed()!;
|
85
103
|
const [pointerA_2, disposePointerA_2] = pointerA.cloneIfNotDisposed()!;
|
@@ -100,7 +118,10 @@ describe('createReferenceCountedPointer', () => {
|
|
100
118
|
|
101
119
|
test('DAG, random', () => {
|
102
120
|
const disposeItem = vi.fn();
|
103
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
121
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
122
|
+
1,
|
123
|
+
disposeItem,
|
124
|
+
]);
|
104
125
|
const [pointerA, disposePointerA] = pointer.cloneIfNotDisposed()!;
|
105
126
|
const [pointerA_1, disposePointerA_1] = pointerA.cloneIfNotDisposed()!;
|
106
127
|
const [pointerA_2, disposePointerA_2] = pointerA.cloneIfNotDisposed()!;
|
@@ -122,7 +143,10 @@ describe('createReferenceCountedPointer', () => {
|
|
122
143
|
|
123
144
|
test('it should throw when disposed twice', () => {
|
124
145
|
const disposeItem = vi.fn();
|
125
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
146
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
147
|
+
1,
|
148
|
+
disposeItem,
|
149
|
+
]);
|
126
150
|
disposePointer();
|
127
151
|
expect(() => {
|
128
152
|
disposePointer();
|
@@ -131,14 +155,20 @@ describe('createReferenceCountedPointer', () => {
|
|
131
155
|
|
132
156
|
test('it should return null when you attempt to retain a disposed pointer', () => {
|
133
157
|
const disposeItem = vi.fn();
|
134
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
158
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
159
|
+
1,
|
160
|
+
disposeItem,
|
161
|
+
]);
|
135
162
|
disposePointer();
|
136
163
|
expect(pointer.cloneIfNotDisposed()).toBe(null);
|
137
164
|
});
|
138
165
|
|
139
166
|
test('it should expose the underlying object only when undisposed', () => {
|
140
167
|
const disposeItem = vi.fn();
|
141
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
168
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
169
|
+
1,
|
170
|
+
disposeItem,
|
171
|
+
]);
|
142
172
|
expect(pointer.getItemIfNotDisposed()).toBe(1);
|
143
173
|
disposePointer();
|
144
174
|
expect(pointer.getItemIfNotDisposed()).toBe(null);
|
@@ -146,7 +176,10 @@ describe('createReferenceCountedPointer', () => {
|
|
146
176
|
|
147
177
|
test('it should accurately report its disposed status', () => {
|
148
178
|
const disposeItem = vi.fn();
|
149
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
179
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
180
|
+
1,
|
181
|
+
disposeItem,
|
182
|
+
]);
|
150
183
|
expect(pointer.isDisposed()).toBe(false);
|
151
184
|
disposePointer();
|
152
185
|
expect(pointer.isDisposed()).toBe(true);
|
@@ -154,7 +187,10 @@ describe('createReferenceCountedPointer', () => {
|
|
154
187
|
|
155
188
|
test('disposable status is unaffected by the presence of other undisposed pointers', () => {
|
156
189
|
const disposeItem = vi.fn();
|
157
|
-
const [pointer, disposePointer] = createReferenceCountedPointer([
|
190
|
+
const [pointer, disposePointer] = createReferenceCountedPointer([
|
191
|
+
1,
|
192
|
+
disposeItem,
|
193
|
+
]);
|
158
194
|
const pointer2 = pointer.cloneIfNotDisposed();
|
159
195
|
assert(pointer2 != null);
|
160
196
|
expect(pointer2[0].isDisposed()).toBe(false);
|
@@ -83,7 +83,9 @@ class RefCounter<T> {
|
|
83
83
|
let disposed = false;
|
84
84
|
const dispose = () => {
|
85
85
|
if (disposed) {
|
86
|
-
throw new Error(
|
86
|
+
throw new Error(
|
87
|
+
'Do not dispose an already-disposed ActiveReference.',
|
88
|
+
);
|
87
89
|
}
|
88
90
|
disposed = true;
|
89
91
|
if (activeReference.__original === null) {
|