@monstermann/dsp 0.2.0 → 0.2.2

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.
@@ -0,0 +1,6 @@
1
+ import { Dsp, DspLink } from "./index.js";
2
+
3
+ //#region src/Dsp/add.d.ts
4
+ declare function add(target: Dsp, value: (() => void) | Dsp): DspLink | undefined;
5
+ //#endregion
6
+ export { add };
@@ -0,0 +1,18 @@
1
+ import { symbol } from "./symbol.js";
2
+ import { createLink, linkDsp, linkVal } from "./internals.js";
3
+ import { dispose } from "./dispose.js";
4
+
5
+ //#region src/Dsp/add.ts
6
+ function add(a, b) {
7
+ if (symbol in b) {
8
+ if (a === b) return;
9
+ if (b[symbol]) return;
10
+ if (a[symbol]) return dispose(b);
11
+ return linkDsp(b, linkVal(a, createLink(a, b)));
12
+ }
13
+ if (a[symbol]) return b();
14
+ return linkVal(a, createLink(a, b));
15
+ }
16
+
17
+ //#endregion
18
+ export { add };
@@ -0,0 +1,6 @@
1
+ import { Dsp } from "./index.js";
2
+
3
+ //#region src/Dsp/create.d.ts
4
+ declare function create(): Dsp;
5
+ //#endregion
6
+ export { create };
@@ -0,0 +1,13 @@
1
+ import { symbol } from "./symbol.js";
2
+
3
+ //#region src/Dsp/create.ts
4
+ function create() {
5
+ return {
6
+ dsps: void 0,
7
+ [symbol]: false,
8
+ vals: void 0
9
+ };
10
+ }
11
+
12
+ //#endregion
13
+ export { create };
@@ -0,0 +1,6 @@
1
+ import { Dsp } from "./index.js";
2
+
3
+ //#region src/Dsp/dispose.d.ts
4
+ declare function dispose(target: Dsp): void;
5
+ //#endregion
6
+ export { dispose };
@@ -0,0 +1,43 @@
1
+ import { symbol } from "./symbol.js";
2
+ import { unlinkVal } from "./internals.js";
3
+
4
+ //#region src/Dsp/dispose.ts
5
+ function dispose(target) {
6
+ let errors;
7
+ let stack = {
8
+ dsp: target,
9
+ prev: void 0
10
+ };
11
+ let dsp = target;
12
+ while (dsp) {
13
+ dsp[symbol] = true;
14
+ while (dsp.dsps) {
15
+ unlinkVal(dsp.dsps);
16
+ dsp.dsps = dsp.dsps.prevDsp;
17
+ }
18
+ while (dsp.vals) {
19
+ const val = dsp.vals.val;
20
+ dsp.vals = dsp.vals.prevVal;
21
+ if (symbol in val) {
22
+ stack = {
23
+ dsp: val,
24
+ prev: stack
25
+ };
26
+ dsp = val;
27
+ } else try {
28
+ val();
29
+ } catch (err) {
30
+ errors ??= [];
31
+ errors.push(err);
32
+ }
33
+ }
34
+ stack = stack?.prev;
35
+ dsp = stack?.dsp;
36
+ }
37
+ if (!errors) return;
38
+ if (errors.length === 1) throw errors[0];
39
+ throw new AggregateError(errors, "DisposeError");
40
+ }
41
+
42
+ //#endregion
43
+ export { dispose };
@@ -0,0 +1,6 @@
1
+ import { Dsp, DspLink } from "./index.js";
2
+
3
+ //#region src/Dsp/find.d.ts
4
+ declare function find(target: Dsp, value: (() => void) | Dsp): DspLink | undefined;
5
+ //#endregion
6
+ export { find };
@@ -0,0 +1,12 @@
1
+ //#region src/Dsp/find.ts
2
+ function find(target, value) {
3
+ let link = target.vals;
4
+ while (link) {
5
+ if (link.val === value) return link;
6
+ link = link.prevVal;
7
+ }
8
+ return link;
9
+ }
10
+
11
+ //#endregion
12
+ export { find };
@@ -0,0 +1,6 @@
1
+ import { Dsp } from "./index.js";
2
+
3
+ //#region src/Dsp/includes.d.ts
4
+ declare function includes(target: Dsp, value: (() => void) | Dsp): boolean;
5
+ //#endregion
6
+ export { includes };
@@ -0,0 +1,9 @@
1
+ import { find } from "./find.js";
2
+
3
+ //#region src/Dsp/includes.ts
4
+ function includes(target, value) {
5
+ return !!find(target, value);
6
+ }
7
+
8
+ //#endregion
9
+ export { includes };
@@ -0,0 +1,31 @@
1
+ import { add } from "./add.js";
2
+ import { create } from "./create.js";
3
+ import { dispose } from "./dispose.js";
4
+ import { find } from "./find.js";
5
+ import { includes } from "./includes.js";
6
+ import { isDisposed } from "./isDisposed.js";
7
+ import { isDsp } from "./isDsp.js";
8
+ import { remove } from "./remove.js";
9
+ import { symbol } from "./symbol.js";
10
+ import { unlink } from "./unlink.js";
11
+
12
+ //#region src/Dsp/index.d.ts
13
+
14
+ interface Dsp {
15
+ [symbol]: boolean;
16
+ dsps: DspLink | undefined;
17
+ vals: DspLink | undefined;
18
+ }
19
+ interface DspLink {
20
+ disposer: Dsp;
21
+ nextDsp: DspLink | undefined;
22
+ nextVal: DspLink | undefined;
23
+ prevDsp: DspLink | undefined;
24
+ prevVal: DspLink | undefined;
25
+ val: (() => void) | Dsp;
26
+ }
27
+ declare namespace Dsp {
28
+ export { add, create, dispose, find, includes, isDisposed, isDsp, remove, symbol, unlink };
29
+ }
30
+ //#endregion
31
+ export { Dsp, DspLink };
@@ -0,0 +1,27 @@
1
+ import { symbol } from "./symbol.js";
2
+ import { dispose } from "./dispose.js";
3
+ import { add } from "./add.js";
4
+ import { create } from "./create.js";
5
+ import { find } from "./find.js";
6
+ import { includes } from "./includes.js";
7
+ import { isDisposed } from "./isDisposed.js";
8
+ import { isDsp } from "./isDsp.js";
9
+ import { unlink } from "./unlink.js";
10
+ import { remove } from "./remove.js";
11
+
12
+ //#region src/Dsp/index.js
13
+ const Dsp = {
14
+ add,
15
+ create,
16
+ dispose,
17
+ find,
18
+ includes,
19
+ isDisposed,
20
+ isDsp,
21
+ remove,
22
+ symbol,
23
+ unlink
24
+ };
25
+
26
+ //#endregion
27
+ export { Dsp };
@@ -0,0 +1,42 @@
1
+ import { symbol } from "./symbol.js";
2
+
3
+ //#region src/Dsp/internals.ts
4
+ function createLink(disposer, val) {
5
+ return {
6
+ disposer,
7
+ nextDsp: void 0,
8
+ nextVal: void 0,
9
+ prevDsp: void 0,
10
+ prevVal: void 0,
11
+ val
12
+ };
13
+ }
14
+ function linkVal(disposer, link) {
15
+ link.prevVal = disposer.vals;
16
+ if (disposer.vals) disposer.vals.nextVal = link;
17
+ disposer.vals = link;
18
+ return link;
19
+ }
20
+ function linkDsp(disposer, link) {
21
+ link.prevDsp = disposer.dsps;
22
+ if (disposer.dsps) disposer.dsps.nextDsp = link;
23
+ disposer.dsps = link;
24
+ return link;
25
+ }
26
+ function unlinkVal(link) {
27
+ if (link.prevVal) link.prevVal.nextVal = link.nextVal;
28
+ if (link.nextVal) link.nextVal.prevVal = link.prevVal;
29
+ if (link.disposer.vals === link) link.disposer.vals = link.prevVal;
30
+ link.nextVal = link.prevVal = void 0;
31
+ }
32
+ function unlinkDsp(link) {
33
+ if (symbol in link.val) {
34
+ if (link.prevDsp) link.prevDsp.nextDsp = link.nextDsp;
35
+ if (link.nextDsp) link.nextDsp.prevDsp = link.prevDsp;
36
+ if (link.val.dsps === link) link.val.dsps = link.prevDsp;
37
+ link.nextDsp = link.prevDsp = void 0;
38
+ }
39
+ }
40
+
41
+ //#endregion
42
+ export { createLink, linkDsp, linkVal, unlinkDsp, unlinkVal };
@@ -0,0 +1,6 @@
1
+ import { Dsp } from "./index.js";
2
+
3
+ //#region src/Dsp/isDisposed.d.ts
4
+ declare function isDisposed(target: Dsp): boolean;
5
+ //#endregion
6
+ export { isDisposed };
@@ -0,0 +1,9 @@
1
+ import { symbol } from "./symbol.js";
2
+
3
+ //#region src/Dsp/isDisposed.ts
4
+ function isDisposed(target) {
5
+ return target[symbol];
6
+ }
7
+
8
+ //#endregion
9
+ export { isDisposed };
@@ -0,0 +1,6 @@
1
+ import { Dsp } from "./index.js";
2
+
3
+ //#region src/Dsp/isDsp.d.ts
4
+ declare function isDsp(value: unknown): value is Dsp;
5
+ //#endregion
6
+ export { isDsp };
@@ -0,0 +1,9 @@
1
+ import { symbol } from "./symbol.js";
2
+
3
+ //#region src/Dsp/isDsp.ts
4
+ function isDsp(value) {
5
+ return value != null && typeof value === "object" && symbol in value;
6
+ }
7
+
8
+ //#endregion
9
+ export { isDsp };
@@ -0,0 +1,6 @@
1
+ import { Dsp } from "./index.js";
2
+
3
+ //#region src/Dsp/remove.d.ts
4
+ declare function remove(disposer: Dsp, value: (() => void) | Dsp): void;
5
+ //#endregion
6
+ export { remove };
@@ -0,0 +1,11 @@
1
+ import { find } from "./find.js";
2
+ import { unlink } from "./unlink.js";
3
+
4
+ //#region src/Dsp/remove.ts
5
+ function remove(disposer, value) {
6
+ const link = find(disposer, value);
7
+ if (link) unlink(link);
8
+ }
9
+
10
+ //#endregion
11
+ export { remove };
@@ -0,0 +1,4 @@
1
+ //#region src/Dsp/symbol.d.ts
2
+ declare const symbol: unique symbol;
3
+ //#endregion
4
+ export { symbol };
@@ -0,0 +1,5 @@
1
+ //#region src/Dsp/symbol.ts
2
+ const symbol = Symbol("Dsp");
3
+
4
+ //#endregion
5
+ export { symbol };
@@ -0,0 +1,6 @@
1
+ import { DspLink } from "./index.js";
2
+
3
+ //#region src/Dsp/unlink.d.ts
4
+ declare function unlink(link: DspLink | undefined): void;
5
+ //#endregion
6
+ export { unlink };
@@ -0,0 +1,11 @@
1
+ import { unlinkDsp, unlinkVal } from "./internals.js";
2
+
3
+ //#region src/Dsp/unlink.ts
4
+ function unlink(link) {
5
+ if (!link) return;
6
+ unlinkVal(link);
7
+ unlinkDsp(link);
8
+ }
9
+
10
+ //#endregion
11
+ export { unlink };
package/dist/index.d.ts CHANGED
@@ -1,64 +1,2 @@
1
- //#region src/Dsp/symbol.d.ts
2
- declare const symbol: unique symbol;
3
- //#endregion
4
- //#region src/Dsp/types.d.ts
5
- interface Dsp$1 {
6
- [symbol]: boolean;
7
- dsps: DspLink$1 | undefined;
8
- vals: DspLink$1 | undefined;
9
- }
10
- interface DspLink$1 {
11
- disposer: Dsp$1;
12
- nextDsp: DspLink$1 | undefined;
13
- nextVal: DspLink$1 | undefined;
14
- prevDsp: DspLink$1 | undefined;
15
- prevVal: DspLink$1 | undefined;
16
- val: (() => void) | Dsp$1;
17
- }
18
- //#endregion
19
- //#region src/Dsp/add.d.ts
20
- declare function add(target: Dsp$1, value: (() => void) | Dsp$1): DspLink$1 | undefined;
21
- //#endregion
22
- //#region src/Dsp/create.d.ts
23
- declare function create(): Dsp$1;
24
- //#endregion
25
- //#region src/Dsp/dispose.d.ts
26
- declare function dispose(target: Dsp$1): void;
27
- //#endregion
28
- //#region src/Dsp/find.d.ts
29
- declare function find(target: Dsp$1, value: (() => void) | Dsp$1): DspLink$1 | undefined;
30
- //#endregion
31
- //#region src/Dsp/includes.d.ts
32
- declare function includes(target: Dsp$1, value: (() => void) | Dsp$1): boolean;
33
- //#endregion
34
- //#region src/Dsp/isDisposed.d.ts
35
- declare function isDisposed(target: Dsp$1): boolean;
36
- //#endregion
37
- //#region src/Dsp/isDsp.d.ts
38
- declare function isDsp(value: unknown): value is Dsp$1;
39
- //#endregion
40
- //#region src/Dsp/remove.d.ts
41
- declare function remove(disposer: Dsp$1, value: (() => void) | Dsp$1): void;
42
- //#endregion
43
- //#region src/Dsp/unlink.d.ts
44
- declare function unlink(link: DspLink$1 | undefined): void;
45
- //#endregion
46
- //#region src/Dsp/index.d.ts
47
- interface Dsp {
48
- [symbol]: boolean;
49
- dsps: DspLink | undefined;
50
- vals: DspLink | undefined;
51
- }
52
- interface DspLink {
53
- disposer: Dsp;
54
- nextDsp: DspLink | undefined;
55
- nextVal: DspLink | undefined;
56
- prevDsp: DspLink | undefined;
57
- prevVal: DspLink | undefined;
58
- val: (() => void) | Dsp;
59
- }
60
- declare namespace Dsp {
61
- export { add, create, dispose, find, includes, isDisposed, isDsp, remove, symbol, unlink };
62
- }
63
- //#endregion
1
+ import { Dsp, DspLink } from "./Dsp/index.js";
64
2
  export { Dsp, DspLink };
package/dist/index.js CHANGED
@@ -1,165 +1,3 @@
1
- //#region src/Dsp/symbol.ts
2
- const symbol = Symbol("Dsp");
1
+ import { Dsp } from "./Dsp/index.js";
3
2
 
4
- //#endregion
5
- //#region src/Dsp/internals.ts
6
- function createLink(disposer, val) {
7
- return {
8
- disposer,
9
- nextDsp: void 0,
10
- nextVal: void 0,
11
- prevDsp: void 0,
12
- prevVal: void 0,
13
- val
14
- };
15
- }
16
- function linkVal(disposer, link) {
17
- link.prevVal = disposer.vals;
18
- if (disposer.vals) disposer.vals.nextVal = link;
19
- disposer.vals = link;
20
- return link;
21
- }
22
- function linkDsp(disposer, link) {
23
- link.prevDsp = disposer.dsps;
24
- if (disposer.dsps) disposer.dsps.nextDsp = link;
25
- disposer.dsps = link;
26
- return link;
27
- }
28
- function unlinkVal(link) {
29
- if (link.prevVal) link.prevVal.nextVal = link.nextVal;
30
- if (link.nextVal) link.nextVal.prevVal = link.prevVal;
31
- if (link.disposer.vals === link) link.disposer.vals = link.prevVal;
32
- link.nextVal = link.prevVal = void 0;
33
- }
34
- function unlinkDsp(link) {
35
- if (symbol in link.val) {
36
- if (link.prevDsp) link.prevDsp.nextDsp = link.nextDsp;
37
- if (link.nextDsp) link.nextDsp.prevDsp = link.prevDsp;
38
- if (link.val.dsps === link) link.val.dsps = link.prevDsp;
39
- link.nextDsp = link.prevDsp = void 0;
40
- }
41
- }
42
-
43
- //#endregion
44
- //#region src/Dsp/dispose.ts
45
- function dispose(target) {
46
- let errors;
47
- let stack = {
48
- dsp: target,
49
- prev: void 0
50
- };
51
- let dsp = target;
52
- while (dsp) {
53
- dsp[symbol] = true;
54
- while (dsp.dsps) {
55
- unlinkVal(dsp.dsps);
56
- dsp.dsps = dsp.dsps.prevDsp;
57
- }
58
- while (dsp.vals) {
59
- const val = dsp.vals.val;
60
- dsp.vals = dsp.vals.prevVal;
61
- if (symbol in val) {
62
- stack = {
63
- dsp: val,
64
- prev: stack
65
- };
66
- dsp = val;
67
- } else try {
68
- val();
69
- } catch (err) {
70
- errors ??= [];
71
- errors.push(err);
72
- }
73
- }
74
- stack = stack?.prev;
75
- dsp = stack?.dsp;
76
- }
77
- if (!errors) return;
78
- if (errors.length === 1) throw errors[0];
79
- throw new AggregateError(errors, "DisposeError");
80
- }
81
-
82
- //#endregion
83
- //#region src/Dsp/add.ts
84
- function add(a, b) {
85
- if (symbol in b) {
86
- if (a === b) return;
87
- if (b[symbol]) return;
88
- if (a[symbol]) return dispose(b);
89
- return linkDsp(b, linkVal(a, createLink(a, b)));
90
- }
91
- if (a[symbol]) return b();
92
- return linkVal(a, createLink(a, b));
93
- }
94
-
95
- //#endregion
96
- //#region src/Dsp/create.ts
97
- function create() {
98
- return {
99
- dsps: void 0,
100
- [symbol]: false,
101
- vals: void 0
102
- };
103
- }
104
-
105
- //#endregion
106
- //#region src/Dsp/find.ts
107
- function find(target, value) {
108
- let link = target.vals;
109
- while (link) {
110
- if (link.val === value) return link;
111
- link = link.prevVal;
112
- }
113
- return link;
114
- }
115
-
116
- //#endregion
117
- //#region src/Dsp/includes.ts
118
- function includes(target, value) {
119
- return !!find(target, value);
120
- }
121
-
122
- //#endregion
123
- //#region src/Dsp/isDisposed.ts
124
- function isDisposed(target) {
125
- return target[symbol];
126
- }
127
-
128
- //#endregion
129
- //#region src/Dsp/isDsp.ts
130
- function isDsp(value) {
131
- return value != null && typeof value === "object" && symbol in value;
132
- }
133
-
134
- //#endregion
135
- //#region src/Dsp/unlink.ts
136
- function unlink(link) {
137
- if (!link) return;
138
- unlinkVal(link);
139
- unlinkDsp(link);
140
- }
141
-
142
- //#endregion
143
- //#region src/Dsp/remove.ts
144
- function remove(disposer, value) {
145
- const link = find(disposer, value);
146
- if (link) unlink(link);
147
- }
148
-
149
- //#endregion
150
- //#region src/Dsp/index.js
151
- const Dsp = {
152
- add,
153
- create,
154
- dispose,
155
- find,
156
- includes,
157
- isDisposed,
158
- isDsp,
159
- remove,
160
- symbol,
161
- unlink
162
- };
163
-
164
- //#endregion
165
3
  export { Dsp };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@monstermann/dsp",
3
3
  "type": "module",
4
- "version": "0.2.0",
4
+ "version": "0.2.2",
5
5
  "description": "Small & fast disposables.",
6
6
  "author": "Michael Ostermann <michaelostermann@me.com>",
7
7
  "license": "MIT",