@monstermann/dsp 0.2.2 → 0.3.0

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.
Files changed (47) hide show
  1. package/README.md +524 -0
  2. package/dist/Dsp/add.d.mts +45 -0
  3. package/dist/Dsp/{add.js → add.mjs} +3 -3
  4. package/dist/Dsp/create.d.mts +25 -0
  5. package/dist/Dsp/create.mjs +31 -0
  6. package/dist/Dsp/dispose.d.mts +95 -0
  7. package/dist/Dsp/dispose.mjs +131 -0
  8. package/dist/Dsp/find.d.mts +44 -0
  9. package/dist/Dsp/find.mjs +49 -0
  10. package/dist/Dsp/includes.d.mts +36 -0
  11. package/dist/Dsp/includes.mjs +38 -0
  12. package/dist/Dsp/{index.d.ts → index.d.mts} +10 -10
  13. package/dist/Dsp/index.mjs +27 -0
  14. package/dist/Dsp/{internals.js → internals.mjs} +1 -1
  15. package/dist/Dsp/isDisposed.d.mts +28 -0
  16. package/dist/Dsp/isDisposed.mjs +30 -0
  17. package/dist/Dsp/isDsp.d.mts +26 -0
  18. package/dist/Dsp/isDsp.mjs +28 -0
  19. package/dist/Dsp/remove.d.mts +34 -0
  20. package/dist/Dsp/remove.mjs +38 -0
  21. package/dist/Dsp/unlink.d.mts +34 -0
  22. package/dist/Dsp/unlink.mjs +38 -0
  23. package/dist/index.d.mts +2 -0
  24. package/dist/index.mjs +3 -0
  25. package/package.json +6 -6
  26. package/dist/Dsp/add.d.ts +0 -6
  27. package/dist/Dsp/create.d.ts +0 -6
  28. package/dist/Dsp/create.js +0 -13
  29. package/dist/Dsp/dispose.d.ts +0 -6
  30. package/dist/Dsp/dispose.js +0 -43
  31. package/dist/Dsp/find.d.ts +0 -6
  32. package/dist/Dsp/find.js +0 -12
  33. package/dist/Dsp/includes.d.ts +0 -6
  34. package/dist/Dsp/includes.js +0 -9
  35. package/dist/Dsp/index.js +0 -27
  36. package/dist/Dsp/isDisposed.d.ts +0 -6
  37. package/dist/Dsp/isDisposed.js +0 -9
  38. package/dist/Dsp/isDsp.d.ts +0 -6
  39. package/dist/Dsp/isDsp.js +0 -9
  40. package/dist/Dsp/remove.d.ts +0 -6
  41. package/dist/Dsp/remove.js +0 -11
  42. package/dist/Dsp/unlink.d.ts +0 -6
  43. package/dist/Dsp/unlink.js +0 -11
  44. package/dist/index.d.ts +0 -2
  45. package/dist/index.js +0 -3
  46. /package/dist/Dsp/{symbol.d.ts → symbol.d.mts} +0 -0
  47. /package/dist/Dsp/{symbol.js → symbol.mjs} +0 -0
@@ -0,0 +1,95 @@
1
+ import { Dsp } from "./index.mjs";
2
+
3
+ //#region src/Dsp/dispose.d.ts
4
+
5
+ /**
6
+ * # Dispose
7
+ *
8
+ * ```ts
9
+ * function Dsp.dispose(disposer: Dsp): void;
10
+ * ```
11
+ *
12
+ * Takes a `Dsp` instance and disposes it, walking through all added values in reverse order (LIFO).
13
+ *
14
+ * Disposed `Dsp`s will dereference themselves from other `Dsp`s.
15
+ *
16
+ * Every added value is wrapped with a `try/catch` and errors are accumulated in an `AggregateError`.
17
+ *
18
+ * ## Example
19
+ *
20
+ * ```ts
21
+ * import { Dsp } from "@monstermann/dsp";
22
+ *
23
+ * const dspA = Dsp.create();
24
+ * Dsp.add(dspA, () => console.log(1));
25
+ * Dsp.add(dspA, () => console.log(2));
26
+ *
27
+ * Dsp.dispose(dspA); // Prints: 2, 1
28
+ * ```
29
+ *
30
+ * ```ts
31
+ * import { Dsp } from "@monstermann/dsp";
32
+ *
33
+ * const dspA = Dsp.create();
34
+ * const dspB = Dsp.create();
35
+ *
36
+ * Dsp.add(dspA, () => console.log(1));
37
+ * Dsp.add(dspA, () => console.log(2));
38
+ * Dsp.add(dspB, () => console.log(3));
39
+ * Dsp.add(dspB, () => console.log(4));
40
+ * Dsp.add(dspA, dspB);
41
+ *
42
+ * Dsp.dispose(dspA); // Prints: 4, 3, 2, 1
43
+ * ```
44
+ *
45
+ * ```ts
46
+ * import { Dsp } from "@monstermann/dsp";
47
+ *
48
+ * const dspA = Dsp.create();
49
+ * const dspB = Dsp.create();
50
+ *
51
+ * Dsp.add(dspA, () => console.log(1));
52
+ * Dsp.add(dspA, () => console.log(2));
53
+ * Dsp.add(dspB, () => console.log(3));
54
+ * Dsp.add(dspB, () => console.log(4));
55
+ * Dsp.add(dspA, dspB);
56
+ *
57
+ * Dsp.dispose(dspB); // Prints: 4, 3
58
+ * Dsp.dispose(dspA); // Prints: 2, 1
59
+ * ```
60
+ *
61
+ * ```ts
62
+ * import { Dsp } from "@monstermann/dsp";
63
+ *
64
+ * const dspA = Dsp.create();
65
+ *
66
+ * Dsp.add(dspA, () => console.log(1));
67
+ * Dsp.add(dspA, () => console.log(2));
68
+ * Dsp.add(dspA, () => {
69
+ * throw new Error();
70
+ * });
71
+ *
72
+ * Dsp.dispose(dspA); // Prints: 2, 1, then rethrows above error
73
+ * ```
74
+ *
75
+ * ```ts
76
+ * import { Dsp } from "@monstermann/dsp";
77
+ *
78
+ * const dspA = Dsp.create();
79
+ *
80
+ * Dsp.add(dspA, () => console.log(1));
81
+ * Dsp.add(dspA, () => console.log(2));
82
+ * Dsp.add(dspA, () => {
83
+ * throw new Error();
84
+ * });
85
+ * Dsp.add(dspA, () => {
86
+ * throw new Error();
87
+ * });
88
+ *
89
+ * Dsp.dispose(dspA); // Prints: 2, 1, then throws AggregateError
90
+ * ```
91
+ *
92
+ */
93
+ declare function dispose(target: Dsp): void;
94
+ //#endregion
95
+ export { dispose };
@@ -0,0 +1,131 @@
1
+ import { symbol } from "./symbol.mjs";
2
+ import { unlinkVal } from "./internals.mjs";
3
+
4
+ //#region src/Dsp/dispose.ts
5
+ /**
6
+ * # Dispose
7
+ *
8
+ * ```ts
9
+ * function Dsp.dispose(disposer: Dsp): void;
10
+ * ```
11
+ *
12
+ * Takes a `Dsp` instance and disposes it, walking through all added values in reverse order (LIFO).
13
+ *
14
+ * Disposed `Dsp`s will dereference themselves from other `Dsp`s.
15
+ *
16
+ * Every added value is wrapped with a `try/catch` and errors are accumulated in an `AggregateError`.
17
+ *
18
+ * ## Example
19
+ *
20
+ * ```ts
21
+ * import { Dsp } from "@monstermann/dsp";
22
+ *
23
+ * const dspA = Dsp.create();
24
+ * Dsp.add(dspA, () => console.log(1));
25
+ * Dsp.add(dspA, () => console.log(2));
26
+ *
27
+ * Dsp.dispose(dspA); // Prints: 2, 1
28
+ * ```
29
+ *
30
+ * ```ts
31
+ * import { Dsp } from "@monstermann/dsp";
32
+ *
33
+ * const dspA = Dsp.create();
34
+ * const dspB = Dsp.create();
35
+ *
36
+ * Dsp.add(dspA, () => console.log(1));
37
+ * Dsp.add(dspA, () => console.log(2));
38
+ * Dsp.add(dspB, () => console.log(3));
39
+ * Dsp.add(dspB, () => console.log(4));
40
+ * Dsp.add(dspA, dspB);
41
+ *
42
+ * Dsp.dispose(dspA); // Prints: 4, 3, 2, 1
43
+ * ```
44
+ *
45
+ * ```ts
46
+ * import { Dsp } from "@monstermann/dsp";
47
+ *
48
+ * const dspA = Dsp.create();
49
+ * const dspB = Dsp.create();
50
+ *
51
+ * Dsp.add(dspA, () => console.log(1));
52
+ * Dsp.add(dspA, () => console.log(2));
53
+ * Dsp.add(dspB, () => console.log(3));
54
+ * Dsp.add(dspB, () => console.log(4));
55
+ * Dsp.add(dspA, dspB);
56
+ *
57
+ * Dsp.dispose(dspB); // Prints: 4, 3
58
+ * Dsp.dispose(dspA); // Prints: 2, 1
59
+ * ```
60
+ *
61
+ * ```ts
62
+ * import { Dsp } from "@monstermann/dsp";
63
+ *
64
+ * const dspA = Dsp.create();
65
+ *
66
+ * Dsp.add(dspA, () => console.log(1));
67
+ * Dsp.add(dspA, () => console.log(2));
68
+ * Dsp.add(dspA, () => {
69
+ * throw new Error();
70
+ * });
71
+ *
72
+ * Dsp.dispose(dspA); // Prints: 2, 1, then rethrows above error
73
+ * ```
74
+ *
75
+ * ```ts
76
+ * import { Dsp } from "@monstermann/dsp";
77
+ *
78
+ * const dspA = Dsp.create();
79
+ *
80
+ * Dsp.add(dspA, () => console.log(1));
81
+ * Dsp.add(dspA, () => console.log(2));
82
+ * Dsp.add(dspA, () => {
83
+ * throw new Error();
84
+ * });
85
+ * Dsp.add(dspA, () => {
86
+ * throw new Error();
87
+ * });
88
+ *
89
+ * Dsp.dispose(dspA); // Prints: 2, 1, then throws AggregateError
90
+ * ```
91
+ *
92
+ */
93
+ function dispose(target) {
94
+ let errors;
95
+ let stack = {
96
+ dsp: target,
97
+ prev: void 0
98
+ };
99
+ let dsp = target;
100
+ while (dsp) {
101
+ dsp[symbol] = true;
102
+ while (dsp.dsps) {
103
+ unlinkVal(dsp.dsps);
104
+ dsp.dsps = dsp.dsps.prevDsp;
105
+ }
106
+ while (dsp.vals) {
107
+ const val = dsp.vals.val;
108
+ dsp.vals = dsp.vals.prevVal;
109
+ if (symbol in val) {
110
+ stack = {
111
+ dsp: val,
112
+ prev: stack
113
+ };
114
+ dsp = val;
115
+ } else try {
116
+ val();
117
+ } catch (err) {
118
+ errors ??= [];
119
+ errors.push(err);
120
+ }
121
+ }
122
+ stack = stack?.prev;
123
+ dsp = stack?.dsp;
124
+ }
125
+ if (!errors) return;
126
+ if (errors.length === 1) throw errors[0];
127
+ throw new AggregateError(errors, "DisposeError");
128
+ }
129
+
130
+ //#endregion
131
+ export { dispose };
@@ -0,0 +1,44 @@
1
+ import { Dsp, DspLink } from "./index.mjs";
2
+
3
+ //#region src/Dsp/find.d.ts
4
+
5
+ /**
6
+ * # find
7
+ *
8
+ * ```ts
9
+ * function Dsp.find(disposer: Dsp, value: (() => void) | Dsp): DspLink | undefined;
10
+ * ```
11
+ *
12
+ * `O(n)`
13
+ *
14
+ * Takes a `Dsp` instance and finds the last occurrence of `value`, the result can be passed to `unlink` to remove it.
15
+ *
16
+ * ## Example
17
+ *
18
+ * ```ts
19
+ * import { Dsp } from "@monstermann/dsp";
20
+ *
21
+ * const dsp = Dsp.create();
22
+ *
23
+ * const cb1 = () => {};
24
+ * const cb2 = () => {};
25
+ *
26
+ * Dsp.add(dsp, cb1);
27
+ *
28
+ * Dsp.includes(dsp, cb1); // true
29
+ * Dsp.includes(dsp, cb2); // false
30
+ *
31
+ * const l1 = Dsp.find(dsp, cb1); // link
32
+ * const l2 = Dsp.find(dsp, cb2); // undefined
33
+ *
34
+ * Dsp.unlink(l1);
35
+ * Dsp.unlink(l2);
36
+ *
37
+ * Dsp.includes(dsp, cb1); // false
38
+ * Dsp.includes(dsp, cb2); // false
39
+ * ```
40
+ *
41
+ */
42
+ declare function find(target: Dsp, value: (() => void) | Dsp): DspLink | undefined;
43
+ //#endregion
44
+ export { find };
@@ -0,0 +1,49 @@
1
+ //#region src/Dsp/find.ts
2
+ /**
3
+ * # find
4
+ *
5
+ * ```ts
6
+ * function Dsp.find(disposer: Dsp, value: (() => void) | Dsp): DspLink | undefined;
7
+ * ```
8
+ *
9
+ * `O(n)`
10
+ *
11
+ * Takes a `Dsp` instance and finds the last occurrence of `value`, the result can be passed to `unlink` to remove it.
12
+ *
13
+ * ## Example
14
+ *
15
+ * ```ts
16
+ * import { Dsp } from "@monstermann/dsp";
17
+ *
18
+ * const dsp = Dsp.create();
19
+ *
20
+ * const cb1 = () => {};
21
+ * const cb2 = () => {};
22
+ *
23
+ * Dsp.add(dsp, cb1);
24
+ *
25
+ * Dsp.includes(dsp, cb1); // true
26
+ * Dsp.includes(dsp, cb2); // false
27
+ *
28
+ * const l1 = Dsp.find(dsp, cb1); // link
29
+ * const l2 = Dsp.find(dsp, cb2); // undefined
30
+ *
31
+ * Dsp.unlink(l1);
32
+ * Dsp.unlink(l2);
33
+ *
34
+ * Dsp.includes(dsp, cb1); // false
35
+ * Dsp.includes(dsp, cb2); // false
36
+ * ```
37
+ *
38
+ */
39
+ function find(target, value) {
40
+ let link = target.vals;
41
+ while (link) {
42
+ if (link.val === value) return link;
43
+ link = link.prevVal;
44
+ }
45
+ return link;
46
+ }
47
+
48
+ //#endregion
49
+ export { find };
@@ -0,0 +1,36 @@
1
+ import { Dsp } from "./index.mjs";
2
+
3
+ //#region src/Dsp/includes.d.ts
4
+
5
+ /**
6
+ * # dspIncludes
7
+ *
8
+ * ```ts
9
+ * function Dsp.includes(disposer: Dsp, value: (() => void) | Dsp): boolean;
10
+ * ```
11
+ *
12
+ * `O(n)`
13
+ *
14
+ * Returns a boolean indicating whether the provided `Dsp` instance includes `value`.
15
+ *
16
+ * By default `add` does not check for duplicates, you can use this or `find` if you need to make sure there are none.
17
+ *
18
+ * ## Example
19
+ *
20
+ * ```ts
21
+ * import { Dsp } from "@monstermann/dsp";
22
+ *
23
+ * const dsp = Dsp.create();
24
+ * const cb = () => {};
25
+ *
26
+ * Dsp.includes(dsp, cb); // false
27
+ * const link = Dsp.add(dsp, cb);
28
+ * Dsp.includes(dsp, cb); // true
29
+ * Dsp.unlink(dsp, link);
30
+ * Dsp.includes(dsp, cb); // false
31
+ * ```
32
+ *
33
+ */
34
+ declare function includes(target: Dsp, value: (() => void) | Dsp): boolean;
35
+ //#endregion
36
+ export { includes };
@@ -0,0 +1,38 @@
1
+ import { find } from "./find.mjs";
2
+
3
+ //#region src/Dsp/includes.ts
4
+ /**
5
+ * # dspIncludes
6
+ *
7
+ * ```ts
8
+ * function Dsp.includes(disposer: Dsp, value: (() => void) | Dsp): boolean;
9
+ * ```
10
+ *
11
+ * `O(n)`
12
+ *
13
+ * Returns a boolean indicating whether the provided `Dsp` instance includes `value`.
14
+ *
15
+ * By default `add` does not check for duplicates, you can use this or `find` if you need to make sure there are none.
16
+ *
17
+ * ## Example
18
+ *
19
+ * ```ts
20
+ * import { Dsp } from "@monstermann/dsp";
21
+ *
22
+ * const dsp = Dsp.create();
23
+ * const cb = () => {};
24
+ *
25
+ * Dsp.includes(dsp, cb); // false
26
+ * const link = Dsp.add(dsp, cb);
27
+ * Dsp.includes(dsp, cb); // true
28
+ * Dsp.unlink(dsp, link);
29
+ * Dsp.includes(dsp, cb); // false
30
+ * ```
31
+ *
32
+ */
33
+ function includes(target, value) {
34
+ return !!find(target, value);
35
+ }
36
+
37
+ //#endregion
38
+ export { includes };
@@ -1,13 +1,13 @@
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";
1
+ import { add } from "./add.mjs";
2
+ import { create } from "./create.mjs";
3
+ import { dispose } from "./dispose.mjs";
4
+ import { find } from "./find.mjs";
5
+ import { includes } from "./includes.mjs";
6
+ import { isDisposed } from "./isDisposed.mjs";
7
+ import { isDsp } from "./isDsp.mjs";
8
+ import { remove } from "./remove.mjs";
9
+ import { symbol } from "./symbol.mjs";
10
+ import { unlink } from "./unlink.mjs";
11
11
 
12
12
  //#region src/Dsp/index.d.ts
13
13
 
@@ -0,0 +1,27 @@
1
+ import { symbol } from "./symbol.mjs";
2
+ import { dispose } from "./dispose.mjs";
3
+ import { add } from "./add.mjs";
4
+ import { create } from "./create.mjs";
5
+ import { find } from "./find.mjs";
6
+ import { includes } from "./includes.mjs";
7
+ import { isDisposed } from "./isDisposed.mjs";
8
+ import { isDsp } from "./isDsp.mjs";
9
+ import { unlink } from "./unlink.mjs";
10
+ import { remove } from "./remove.mjs";
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 };
@@ -1,4 +1,4 @@
1
- import { symbol } from "./symbol.js";
1
+ import { symbol } from "./symbol.mjs";
2
2
 
3
3
  //#region src/Dsp/internals.ts
4
4
  function createLink(disposer, val) {
@@ -0,0 +1,28 @@
1
+ import { Dsp } from "./index.mjs";
2
+
3
+ //#region src/Dsp/isDisposed.d.ts
4
+
5
+ /**
6
+ * # isDisposed
7
+ *
8
+ * ```ts
9
+ * function Dsp.isDisposed(disposer: Dsp): boolean;
10
+ * ```
11
+ *
12
+ * Returns a boolean indicating whether the provided `Dsp` instance has been disposed.
13
+ *
14
+ * ## Example
15
+ *
16
+ * ```ts
17
+ * import { Dsp } from "@monstermann/dsp";
18
+ *
19
+ * const dsp = Dsp.create();
20
+ * Dsp.isDisposed(dsp); // false
21
+ * Dsp.dispose(dsp);
22
+ * Dsp.isDisposed(dsp); // true
23
+ * ```
24
+ *
25
+ */
26
+ declare function isDisposed(target: Dsp): boolean;
27
+ //#endregion
28
+ export { isDisposed };
@@ -0,0 +1,30 @@
1
+ import { symbol } from "./symbol.mjs";
2
+
3
+ //#region src/Dsp/isDisposed.ts
4
+ /**
5
+ * # isDisposed
6
+ *
7
+ * ```ts
8
+ * function Dsp.isDisposed(disposer: Dsp): boolean;
9
+ * ```
10
+ *
11
+ * Returns a boolean indicating whether the provided `Dsp` instance has been disposed.
12
+ *
13
+ * ## Example
14
+ *
15
+ * ```ts
16
+ * import { Dsp } from "@monstermann/dsp";
17
+ *
18
+ * const dsp = Dsp.create();
19
+ * Dsp.isDisposed(dsp); // false
20
+ * Dsp.dispose(dsp);
21
+ * Dsp.isDisposed(dsp); // true
22
+ * ```
23
+ *
24
+ */
25
+ function isDisposed(target) {
26
+ return target[symbol];
27
+ }
28
+
29
+ //#endregion
30
+ export { isDisposed };
@@ -0,0 +1,26 @@
1
+ import { Dsp } from "./index.mjs";
2
+
3
+ //#region src/Dsp/isDsp.d.ts
4
+
5
+ /**
6
+ * # isDsp
7
+ *
8
+ * ```ts
9
+ * function Dsp.isDsp(value: unknown): value is Dsp;
10
+ * ```
11
+ *
12
+ * Checks whether the provided `value` is a `Dsp` instance.
13
+ *
14
+ * ## Example
15
+ *
16
+ * ```ts
17
+ * import { Dsp } from "@monstermann/dsp";
18
+ *
19
+ * const dsp = Dsp.create();
20
+ * Dsp.isDsp(dsp); // true
21
+ * ```
22
+ *
23
+ */
24
+ declare function isDsp(value: unknown): value is Dsp;
25
+ //#endregion
26
+ export { isDsp };
@@ -0,0 +1,28 @@
1
+ import { symbol } from "./symbol.mjs";
2
+
3
+ //#region src/Dsp/isDsp.ts
4
+ /**
5
+ * # isDsp
6
+ *
7
+ * ```ts
8
+ * function Dsp.isDsp(value: unknown): value is Dsp;
9
+ * ```
10
+ *
11
+ * Checks whether the provided `value` is a `Dsp` instance.
12
+ *
13
+ * ## Example
14
+ *
15
+ * ```ts
16
+ * import { Dsp } from "@monstermann/dsp";
17
+ *
18
+ * const dsp = Dsp.create();
19
+ * Dsp.isDsp(dsp); // true
20
+ * ```
21
+ *
22
+ */
23
+ function isDsp(value) {
24
+ return value != null && typeof value === "object" && symbol in value;
25
+ }
26
+
27
+ //#endregion
28
+ export { isDsp };
@@ -0,0 +1,34 @@
1
+ import { Dsp } from "./index.mjs";
2
+
3
+ //#region src/Dsp/remove.d.ts
4
+
5
+ /**
6
+ * # remove
7
+ *
8
+ * ```ts
9
+ * function Dsp.remove(disposer: Dsp, value: (() => void) | Dsp): void;
10
+ * ```
11
+ *
12
+ * `O(n)`
13
+ *
14
+ * Takes a `Dsp` instance and removes the last occurrence of `value` from it.
15
+ *
16
+ * If you can, use `unlink` as it is `O(1)`.
17
+ *
18
+ * ## Example
19
+ *
20
+ * ```ts
21
+ * import { Dsp } from "@monstermann/dsp";
22
+ *
23
+ * const dsp = Dsp.create();
24
+ * const cb = () => {};
25
+ * const link = Dsp.add(dsp, cb);
26
+ * Dsp.includes(dsp, cb); // true
27
+ * Dsp.remove(dsp, cb);
28
+ * Dsp.includes(dsp, cb); // false
29
+ * ```
30
+ *
31
+ */
32
+ declare function remove(disposer: Dsp, value: (() => void) | Dsp): void;
33
+ //#endregion
34
+ export { remove };
@@ -0,0 +1,38 @@
1
+ import { find } from "./find.mjs";
2
+ import { unlink } from "./unlink.mjs";
3
+
4
+ //#region src/Dsp/remove.ts
5
+ /**
6
+ * # remove
7
+ *
8
+ * ```ts
9
+ * function Dsp.remove(disposer: Dsp, value: (() => void) | Dsp): void;
10
+ * ```
11
+ *
12
+ * `O(n)`
13
+ *
14
+ * Takes a `Dsp` instance and removes the last occurrence of `value` from it.
15
+ *
16
+ * If you can, use `unlink` as it is `O(1)`.
17
+ *
18
+ * ## Example
19
+ *
20
+ * ```ts
21
+ * import { Dsp } from "@monstermann/dsp";
22
+ *
23
+ * const dsp = Dsp.create();
24
+ * const cb = () => {};
25
+ * const link = Dsp.add(dsp, cb);
26
+ * Dsp.includes(dsp, cb); // true
27
+ * Dsp.remove(dsp, cb);
28
+ * Dsp.includes(dsp, cb); // false
29
+ * ```
30
+ *
31
+ */
32
+ function remove(disposer, value) {
33
+ const link = find(disposer, value);
34
+ if (link) unlink(link);
35
+ }
36
+
37
+ //#endregion
38
+ export { remove };
@@ -0,0 +1,34 @@
1
+ import { DspLink } from "./index.mjs";
2
+
3
+ //#region src/Dsp/unlink.d.ts
4
+
5
+ /**
6
+ * # unlink
7
+ *
8
+ * ```ts
9
+ * function Dsp.unlink(link: DspLink | undefined): void;
10
+ * ```
11
+ *
12
+ * `O(1)`
13
+ *
14
+ * Takes a value constructed by `add` and destroys all references.
15
+ *
16
+ * ## Example
17
+ *
18
+ * ```ts
19
+ * import { Dsp } from "@monstermann/dsp";
20
+ *
21
+ * const cb = () => {};
22
+ *
23
+ * const dsp = Dsp.create();
24
+ * const link = Dsp.add(dsp, cb);
25
+ *
26
+ * Dsp.includes(dsp, cb); // true
27
+ * Dsp.unlink(link);
28
+ * Dsp.includes(dsp, cb); // false
29
+ * ```
30
+ *
31
+ */
32
+ declare function unlink(link: DspLink | undefined): void;
33
+ //#endregion
34
+ export { unlink };