@ersbeth/picoflow 1.0.0 → 1.1.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 (180) hide show
  1. package/.cursor/plans/unifier-flowresource-avec-flowderivation-c9506e24.plan.md +372 -0
  2. package/README.md +25 -171
  3. package/biome.json +4 -1
  4. package/dist/picoflow.js +1129 -661
  5. package/dist/types/flow/base/flowDisposable.d.ts +67 -0
  6. package/dist/types/flow/base/flowDisposable.d.ts.map +1 -0
  7. package/dist/types/flow/base/flowEffect.d.ts +127 -0
  8. package/dist/types/flow/base/flowEffect.d.ts.map +1 -0
  9. package/dist/types/flow/base/flowGraph.d.ts +97 -0
  10. package/dist/types/flow/base/flowGraph.d.ts.map +1 -0
  11. package/dist/types/flow/base/flowSignal.d.ts +134 -0
  12. package/dist/types/flow/base/flowSignal.d.ts.map +1 -0
  13. package/dist/types/flow/base/flowTracker.d.ts +15 -0
  14. package/dist/types/flow/base/flowTracker.d.ts.map +1 -0
  15. package/dist/types/flow/base/index.d.ts +7 -0
  16. package/dist/types/flow/base/index.d.ts.map +1 -0
  17. package/dist/types/flow/base/utils.d.ts +20 -0
  18. package/dist/types/flow/base/utils.d.ts.map +1 -0
  19. package/dist/types/{advanced/array.d.ts → flow/collections/flowArray.d.ts} +50 -12
  20. package/dist/types/flow/collections/flowArray.d.ts.map +1 -0
  21. package/dist/types/flow/collections/flowMap.d.ts +224 -0
  22. package/dist/types/flow/collections/flowMap.d.ts.map +1 -0
  23. package/dist/types/flow/collections/index.d.ts +3 -0
  24. package/dist/types/flow/collections/index.d.ts.map +1 -0
  25. package/dist/types/flow/index.d.ts +4 -0
  26. package/dist/types/flow/index.d.ts.map +1 -0
  27. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts +137 -0
  28. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts.map +1 -0
  29. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts +137 -0
  30. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts.map +1 -0
  31. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts +343 -0
  32. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts.map +1 -0
  33. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts +81 -0
  34. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts.map +1 -0
  35. package/dist/types/flow/nodes/async/flowStateAsync.d.ts +111 -0
  36. package/dist/types/flow/nodes/async/flowStateAsync.d.ts.map +1 -0
  37. package/dist/types/flow/nodes/async/index.d.ts +6 -0
  38. package/dist/types/flow/nodes/async/index.d.ts.map +1 -0
  39. package/dist/types/flow/nodes/index.d.ts +3 -0
  40. package/dist/types/flow/nodes/index.d.ts.map +1 -0
  41. package/dist/types/flow/nodes/sync/flowConstant.d.ts +108 -0
  42. package/dist/types/flow/nodes/sync/flowConstant.d.ts.map +1 -0
  43. package/dist/types/flow/nodes/sync/flowDerivation.d.ts +100 -0
  44. package/dist/types/flow/nodes/sync/flowDerivation.d.ts.map +1 -0
  45. package/dist/types/flow/nodes/sync/flowNode.d.ts +314 -0
  46. package/dist/types/flow/nodes/sync/flowNode.d.ts.map +1 -0
  47. package/dist/types/flow/nodes/sync/flowReadonly.d.ts +57 -0
  48. package/dist/types/flow/nodes/sync/flowReadonly.d.ts.map +1 -0
  49. package/dist/types/flow/nodes/sync/flowState.d.ts +96 -0
  50. package/dist/types/flow/nodes/sync/flowState.d.ts.map +1 -0
  51. package/dist/types/flow/nodes/sync/index.d.ts +6 -0
  52. package/dist/types/flow/nodes/sync/index.d.ts.map +1 -0
  53. package/dist/types/index.d.ts +1 -4
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/solid/converters.d.ts +34 -44
  56. package/dist/types/solid/converters.d.ts.map +1 -1
  57. package/dist/types/solid/primitives.d.ts +1 -0
  58. package/dist/types/solid/primitives.d.ts.map +1 -1
  59. package/docs/.vitepress/config.mts +1 -1
  60. package/docs/api/typedoc-sidebar.json +81 -1
  61. package/package.json +60 -58
  62. package/src/flow/base/flowDisposable.ts +71 -0
  63. package/src/flow/base/flowEffect.ts +171 -0
  64. package/src/flow/base/flowGraph.ts +288 -0
  65. package/src/flow/base/flowSignal.ts +207 -0
  66. package/src/flow/base/flowTracker.ts +17 -0
  67. package/src/flow/base/index.ts +6 -0
  68. package/src/flow/base/utils.ts +19 -0
  69. package/src/flow/collections/flowArray.ts +409 -0
  70. package/src/flow/collections/flowMap.ts +398 -0
  71. package/src/flow/collections/index.ts +2 -0
  72. package/src/flow/index.ts +3 -0
  73. package/src/flow/nodes/async/flowConstantAsync.ts +142 -0
  74. package/src/flow/nodes/async/flowDerivationAsync.ts +143 -0
  75. package/src/flow/nodes/async/flowNodeAsync.ts +474 -0
  76. package/src/flow/nodes/async/flowReadonlyAsync.ts +81 -0
  77. package/src/flow/nodes/async/flowStateAsync.ts +116 -0
  78. package/src/flow/nodes/async/index.ts +5 -0
  79. package/src/flow/nodes/await/advanced/index.ts +5 -0
  80. package/src/{advanced → flow/nodes/await/advanced}/resource.ts +37 -3
  81. package/src/{advanced → flow/nodes/await/advanced}/resourceAsync.ts +35 -3
  82. package/src/{advanced → flow/nodes/await/advanced}/stream.ts +40 -2
  83. package/src/{advanced → flow/nodes/await/advanced}/streamAsync.ts +38 -3
  84. package/src/flow/nodes/await/flowConstantAwait.ts +154 -0
  85. package/src/flow/nodes/await/flowDerivationAwait.ts +154 -0
  86. package/src/flow/nodes/await/flowNodeAwait.ts +508 -0
  87. package/src/flow/nodes/await/flowReadonlyAwait.ts +89 -0
  88. package/src/flow/nodes/await/flowStateAwait.ts +130 -0
  89. package/src/flow/nodes/await/index.ts +5 -0
  90. package/src/flow/nodes/index.ts +3 -0
  91. package/src/flow/nodes/sync/flowConstant.ts +111 -0
  92. package/src/flow/nodes/sync/flowDerivation.ts +105 -0
  93. package/src/flow/nodes/sync/flowNode.ts +439 -0
  94. package/src/flow/nodes/sync/flowReadonly.ts +57 -0
  95. package/src/flow/nodes/sync/flowState.ts +101 -0
  96. package/src/flow/nodes/sync/index.ts +5 -0
  97. package/src/index.ts +1 -47
  98. package/src/solid/converters.ts +59 -198
  99. package/src/solid/primitives.ts +4 -0
  100. package/test/base/flowEffect.test.ts +108 -0
  101. package/test/base/flowGraph.test.ts +485 -0
  102. package/test/base/flowSignal.test.ts +372 -0
  103. package/test/collections/flowArray.asyncStates.test.ts +1553 -0
  104. package/test/collections/flowArray.scalars.test.ts +1129 -0
  105. package/test/collections/flowArray.states.test.ts +1365 -0
  106. package/test/collections/flowMap.asyncStates.test.ts +1105 -0
  107. package/test/collections/flowMap.scalars.test.ts +877 -0
  108. package/test/collections/flowMap.states.test.ts +1097 -0
  109. package/test/nodes/async/flowConstantAsync.test.ts +860 -0
  110. package/test/nodes/async/flowDerivationAsync.test.ts +1517 -0
  111. package/test/nodes/async/flowStateAsync.test.ts +1387 -0
  112. package/test/{resource.test.ts → nodes/await/advanced/resource.test.ts} +21 -19
  113. package/test/{resourceAsync.test.ts → nodes/await/advanced/resourceAsync.test.ts} +3 -1
  114. package/test/{stream.test.ts → nodes/await/advanced/stream.test.ts} +30 -28
  115. package/test/{streamAsync.test.ts → nodes/await/advanced/streamAsync.test.ts} +16 -14
  116. package/test/nodes/await/flowConstantAwait.test.ts +643 -0
  117. package/test/nodes/await/flowDerivationAwait.test.ts +1583 -0
  118. package/test/nodes/await/flowStateAwait.test.ts +999 -0
  119. package/test/nodes/mixed/derivation.test.ts +1527 -0
  120. package/test/nodes/sync/flowConstant.test.ts +620 -0
  121. package/test/nodes/sync/flowDerivation.test.ts +1373 -0
  122. package/test/nodes/sync/flowState.test.ts +945 -0
  123. package/test/solid/converters.test.ts +721 -0
  124. package/test/solid/primitives.test.ts +1031 -0
  125. package/tsconfig.json +2 -1
  126. package/vitest.config.ts +7 -1
  127. package/IMPLEMENTATION_GUIDE.md +0 -1578
  128. package/dist/types/advanced/array.d.ts.map +0 -1
  129. package/dist/types/advanced/index.d.ts +0 -9
  130. package/dist/types/advanced/index.d.ts.map +0 -1
  131. package/dist/types/advanced/map.d.ts +0 -166
  132. package/dist/types/advanced/map.d.ts.map +0 -1
  133. package/dist/types/advanced/resource.d.ts +0 -78
  134. package/dist/types/advanced/resource.d.ts.map +0 -1
  135. package/dist/types/advanced/resourceAsync.d.ts +0 -56
  136. package/dist/types/advanced/resourceAsync.d.ts.map +0 -1
  137. package/dist/types/advanced/stream.d.ts +0 -117
  138. package/dist/types/advanced/stream.d.ts.map +0 -1
  139. package/dist/types/advanced/streamAsync.d.ts +0 -97
  140. package/dist/types/advanced/streamAsync.d.ts.map +0 -1
  141. package/dist/types/basic/constant.d.ts +0 -60
  142. package/dist/types/basic/constant.d.ts.map +0 -1
  143. package/dist/types/basic/derivation.d.ts +0 -89
  144. package/dist/types/basic/derivation.d.ts.map +0 -1
  145. package/dist/types/basic/disposable.d.ts +0 -82
  146. package/dist/types/basic/disposable.d.ts.map +0 -1
  147. package/dist/types/basic/effect.d.ts +0 -67
  148. package/dist/types/basic/effect.d.ts.map +0 -1
  149. package/dist/types/basic/index.d.ts +0 -10
  150. package/dist/types/basic/index.d.ts.map +0 -1
  151. package/dist/types/basic/observable.d.ts +0 -83
  152. package/dist/types/basic/observable.d.ts.map +0 -1
  153. package/dist/types/basic/signal.d.ts +0 -69
  154. package/dist/types/basic/signal.d.ts.map +0 -1
  155. package/dist/types/basic/state.d.ts +0 -47
  156. package/dist/types/basic/state.d.ts.map +0 -1
  157. package/dist/types/basic/trackingContext.d.ts +0 -33
  158. package/dist/types/basic/trackingContext.d.ts.map +0 -1
  159. package/dist/types/creators.d.ts +0 -340
  160. package/dist/types/creators.d.ts.map +0 -1
  161. package/src/advanced/array.ts +0 -222
  162. package/src/advanced/index.ts +0 -12
  163. package/src/advanced/map.ts +0 -193
  164. package/src/basic/constant.ts +0 -97
  165. package/src/basic/derivation.ts +0 -147
  166. package/src/basic/disposable.ts +0 -86
  167. package/src/basic/effect.ts +0 -104
  168. package/src/basic/index.ts +0 -9
  169. package/src/basic/observable.ts +0 -109
  170. package/src/basic/signal.ts +0 -145
  171. package/src/basic/state.ts +0 -60
  172. package/src/basic/trackingContext.ts +0 -45
  173. package/src/creators.ts +0 -395
  174. package/test/array.test.ts +0 -600
  175. package/test/constant.test.ts +0 -44
  176. package/test/derivation.test.ts +0 -539
  177. package/test/effect.test.ts +0 -29
  178. package/test/map.test.ts +0 -240
  179. package/test/signal.test.ts +0 -72
  180. package/test/state.test.ts +0 -212
@@ -1,109 +0,0 @@
1
- import { FlowEffect } from "./effect";
2
- import { FlowSignal } from "./signal";
3
- import type { TrackingContext } from "./trackingContext";
4
-
5
- /**
6
- * Represents a reactive observable that holds and tracks a value.
7
- *
8
- * @remarks
9
- * FlowObservable is the base class for all reactive values in PicoFlow. It provides two ways
10
- * to access the current value:
11
- *
12
- * 1. **Tracked access** via `get(context)`: Registers the observable as a dependency in the
13
- * tracking context, so changes trigger re-execution of the effect or derivation.
14
- *
15
- * 2. **Untracked access** via `pick()` or `get(null)`: Reads the current value without registering
16
- * a dependency, useful for reading values within effects that shouldn't trigger re-runs.
17
- *
18
- * Subclasses must implement the {@link FlowObservable._getRaw} method to provide the actual value.
19
- *
20
- * @typeParam T - The type of the value held by the observable.
21
- * @public
22
- */
23
- export abstract class FlowObservable<T> extends FlowSignal {
24
- /**
25
- * Gets the current value with optional dependency tracking.
26
- *
27
- * @param context - The tracking context for reactive tracking, or null for untracked access.
28
- * When a context is provided, this observable is registered as a dependency. When null,
29
- * the value is read without any tracking.
30
- *
31
- * @returns The current value of type T.
32
- *
33
- * @remarks
34
- * Use `get(t)` within effects and derivations to create reactive dependencies.
35
- * Use `get(null)` when you need to read a value without tracking (though `pick()` is more idiomatic).
36
- *
37
- * @example
38
- * ```typescript
39
- * effect((t) => {
40
- * const tracked = $state.get(t); // Dependency registered
41
- * const untracked = $other.get(null); // No dependency
42
- * });
43
- * ```
44
- *
45
- * @public
46
- */
47
- get(context: TrackingContext | null): T {
48
- if (context) {
49
- this.watch(context);
50
- }
51
- return this._getRaw();
52
- }
53
-
54
- /**
55
- * Gets the current value without any dependency tracking.
56
- *
57
- * @returns The current value of type T.
58
- *
59
- * @remarks
60
- * This method is equivalent to calling `get(null)` but provides a more semantic and readable API.
61
- * Use `pick()` when you want to read a snapshot of the current value without creating a reactive
62
- * dependency. This is useful for:
63
- * - Reading initial values
64
- * - Accessing configuration that shouldn't trigger updates
65
- * - Mixing tracked and untracked reads in the same effect
66
- *
67
- * @example
68
- * ```typescript
69
- * // Read a snapshot outside reactive context
70
- * const currentValue = $state.pick();
71
- *
72
- * // Mix tracked and untracked reads
73
- * effect((t) => {
74
- * const tracked = $reactive.get(t); // Triggers re-runs
75
- * const snapshot = $config.pick(); // Doesn't trigger re-runs
76
- * processData(tracked, snapshot);
77
- * });
78
- * ```
79
- *
80
- * @public
81
- */
82
- pick(): T {
83
- return this._getRaw();
84
- }
85
-
86
- /**
87
- * Internal method to retrieve the raw value.
88
- * Subclasses must override this method to provide the current value.
89
- * @internal
90
- */
91
- protected abstract _getRaw(): T;
92
-
93
- /* INTERNAL -------------------------------------------*/
94
-
95
- /** @internal */ protected _value!: T;
96
-
97
- /**
98
- * Subscribes a listener function to changes of the observable.
99
- * The listener is executed immediately with the current value and on subsequent updates.
100
- * @param listener - A callback function that receives the new value.
101
- * @returns A disposer function to cancel the subscription.
102
- */
103
- subscribe(listener: (value: T) => void): () => void {
104
- const effect = new FlowEffect((t) => {
105
- listener(this.get(t));
106
- });
107
- return () => effect.dispose();
108
- }
109
- }
@@ -1,145 +0,0 @@
1
- import type { FlowDisposable } from "./disposable";
2
- import type { FlowEffect } from "./effect";
3
- import type { TrackingContext } from "./trackingContext";
4
-
5
- /**
6
- * Represents a reactive signal.
7
- *
8
- * @remarks Use FlowSignal to create reactive streams that notify listeners and execute associated effects.
9
- * Signals can be triggered and disposed. Once disposed, interactions with the signal will throw errors.
10
- * @public
11
- */
12
- export class FlowSignal implements FlowDisposable {
13
- /**
14
- * Triggers the FlowSignal.
15
- * Notifies all registered listeners and schedules execution of associated effects.
16
- * @throws If the FlowSignal has already been disposed.
17
- * @public
18
- */
19
- public trigger(): void {
20
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
21
- this._notify();
22
- }
23
-
24
- /**
25
- * Watches the signal, registering it as a dependency in the tracking context.
26
- *
27
- * @param context - The tracking context in which to register this signal as a dependency.
28
- *
29
- * @remarks
30
- * Use `watch()` when you want to track a signal without reading its value (signals don't
31
- * have values to read). This is useful for triggering effects based on signal events
32
- * without needing associated data.
33
- *
34
- * When the signal is triggered via `trigger()`, any effects or derivations that have
35
- * watched this signal will automatically re-execute.
36
- *
37
- * This method must be called within an effect or derivation context where a TrackingContext
38
- * is available. For observables (which hold values), use `.get(t)` instead, which both
39
- * reads the value and watches for changes.
40
- *
41
- * @throws Error if the signal has been disposed.
42
- *
43
- * @example
44
- * ```typescript
45
- * const $signal = signal();
46
- *
47
- * effect((t) => {
48
- * $signal.watch(t); // Track the signal
49
- * console.log('Signal triggered!');
50
- * });
51
- *
52
- * $signal.trigger(); // Logs: "Signal triggered!"
53
- * ```
54
- *
55
- * @public
56
- */
57
- public watch(context: TrackingContext): void {
58
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
59
- context._registerDependency(this);
60
- }
61
-
62
- /**
63
- * Disposes the FlowSignal.
64
- * Cleans up all registered effects, listeners, and dependencies.
65
- * Once disposed, further usage of the signal will throw an error.
66
- * @throws If the FlowSignal is already disposed.
67
- * @public
68
- */
69
- public dispose(options?: { self: boolean }): void {
70
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
71
- if (options?.self) {
72
- Array.from(this._effects).forEach((effect) => {
73
- effect._unregisterDependency(this);
74
- });
75
- Array.from(this._listeners).forEach((listener) => {
76
- listener._unregisterDependency(this);
77
- });
78
- } else {
79
- Array.from(this._effects).forEach((effect) => {
80
- effect.dispose();
81
- });
82
- Array.from(this._listeners).forEach((listener) => {
83
- listener.dispose();
84
- });
85
- }
86
- Array.from(this._dependencies).forEach((dependency) => {
87
- this._unregisterDependency(dependency);
88
- });
89
- this._disposed = true;
90
- }
91
-
92
- /**
93
- * Indicates whether the FlowSignal has been disposed.
94
- * @remarks Once disposed, the signal should not be used.
95
- * @public
96
- */
97
- public get disposed(): boolean {
98
- return this._disposed;
99
- }
100
-
101
- /* INTERNAL ------------------------------------------------------------- */
102
-
103
- /** @internal */ protected _disposed = false;
104
-
105
- /** @internal */ protected _dependencies = new Set<FlowSignal>();
106
-
107
- /** @internal */ protected _listeners = new Set<FlowSignal>();
108
-
109
- /** @internal */ protected _effects = new Set<FlowEffect>();
110
-
111
- /** @internal */ _notify(): void {
112
- this._listeners.forEach((listener) => {
113
- listener._notify();
114
- });
115
- this._effects.forEach((effect) => {
116
- effect._exec();
117
- });
118
- }
119
-
120
- /** @internal */ _registerDependency(dependency: FlowSignal): void {
121
- this._dependencies.add(dependency);
122
- dependency._registerListener(this);
123
- }
124
-
125
- /** @internal */ _unregisterDependency(dependency: FlowSignal): void {
126
- this._dependencies.delete(dependency);
127
- dependency._unregisterListener(this);
128
- }
129
-
130
- /** @internal */ _registerListener(signal: FlowSignal): void {
131
- this._listeners.add(signal);
132
- }
133
-
134
- /** @internal */ _unregisterListener(signal: FlowSignal): void {
135
- this._listeners.delete(signal);
136
- }
137
-
138
- /** @internal */ _registerEffect(effect: FlowEffect): void {
139
- this._effects.add(effect);
140
- }
141
-
142
- /** @internal */ _unregisterEffect(effect: FlowEffect): void {
143
- this._effects.delete(effect);
144
- }
145
- }
@@ -1,60 +0,0 @@
1
- import { FlowConstant } from "./constant";
2
-
3
- /**
4
- * Represents a reactive state that holds a mutable value.
5
- *
6
- * @typeParam T - The type of the state value.
7
- *
8
- * @remarks
9
- * FlowState extends FlowConstant and inherits reactive value access methods from FlowObservable.
10
- * You can read the state value using `get(context)` for tracked access or `pick()` for untracked access.
11
- * Use the {@link FlowState.set} method to update the state value.
12
- *
13
- * When the state is updated with a new value that differs from the current value, all dependent
14
- * effects and derivations are automatically notified and re-executed. If the new value is strictly
15
- * equal to the current value, no notification occurs.
16
- *
17
- * @example
18
- * ```typescript
19
- * const $count = state(0);
20
- *
21
- * // Read with tracking
22
- * effect((t) => {
23
- * console.log($count.get(t)); // Effect re-runs when $count changes
24
- * });
25
- *
26
- * // Read without tracking
27
- * const snapshot = $count.pick();
28
- *
29
- * // Update the value
30
- * $count.set(1);
31
- * $count.set(current => current + 1);
32
- * ```
33
- *
34
- * @public
35
- */
36
- export class FlowState<T> extends FlowConstant<T> {
37
- /**
38
- * Updates the state with a new value.
39
- * @param value - A new value or a callback function that computes a new value based on the current state.
40
- * @remarks
41
- * If the computed new value is strictly equal to the current state value, no change is made and subscribers
42
- * will not be notified. Otherwise, the state is updated and all subscribers are informed of the change.
43
- * @throws Error if the state has been disposed.
44
- * @public
45
- */
46
- set(value: T | ((current: T) => T)): void {
47
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
48
-
49
- // compute new value
50
- const next =
51
- typeof value === "function"
52
- ? (value as (current: T) => T)(this._value)
53
- : value;
54
-
55
- // apply new value
56
- if (next === this._value) return;
57
- this._value = next;
58
- this._notify();
59
- }
60
- }
@@ -1,45 +0,0 @@
1
- import type { FlowDerivation } from "./derivation";
2
- import type { FlowEffect } from "./effect";
3
- import type { FlowSignal } from "./signal";
4
-
5
- /**
6
- * Represents a tracking context used to register dependencies during reactive computations.
7
- *
8
- * @remarks
9
- * TrackingContext is the core mechanism that enables automatic dependency tracking in PicoFlow's
10
- * reactive system. When you create an effect or derivation, PicoFlow automatically creates and
11
- * manages a TrackingContext instance for you. This context is passed as a parameter (typically
12
- * named `t`) to your computation functions.
13
- *
14
- * You use the tracking context to explicitly mark which observables should be tracked as dependencies:
15
- * - Call `observable.get(t)` to read a value AND register it as a dependency
16
- * - Call `observable.pick()` to read a value WITHOUT registering it as a dependency
17
- * - Call `signal.watch(t)` to register a signal as a dependency without reading a value
18
- *
19
- * End-users typically don't instantiate TrackingContext directly; instead, they receive it as
20
- * a parameter in effect and derivation callbacks.
21
- *
22
- * @example
23
- * ```typescript
24
- * // TrackingContext passed as parameter 't'
25
- * effect((t) => {
26
- * const value = $state.get(t); // Tracked dependency
27
- * const snapshot = $other.pick(); // Not tracked
28
- * console.log(value, snapshot);
29
- * });
30
- * ```
31
- *
32
- * @public
33
- */
34
- export class TrackingContext {
35
- /** @internal */
36
- constructor(private _owner: FlowEffect | FlowDerivation<unknown>) {}
37
-
38
- /**
39
- * Registers a dependency on the given signal.
40
- * @internal
41
- */
42
- /** @internal */ _registerDependency(signal: FlowSignal): void {
43
- this._owner._registerDependency(signal);
44
- }
45
- }