@ersbeth/picoflow 0.2.4 → 1.0.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.
Files changed (248) hide show
  1. package/.cursor/plans/update-js-e795d61b.plan.md +567 -0
  2. package/.gitlab-ci.yml +24 -0
  3. package/.vscode/settings.json +3 -3
  4. package/CHANGELOG.md +51 -0
  5. package/IMPLEMENTATION_GUIDE.md +1578 -0
  6. package/README.md +9 -134
  7. package/biome.json +32 -32
  8. package/dist/picoflow.js +610 -436
  9. package/dist/types/advanced/array.d.ts +0 -6
  10. package/dist/types/advanced/array.d.ts.map +1 -1
  11. package/dist/types/advanced/index.d.ts +5 -5
  12. package/dist/types/advanced/index.d.ts.map +1 -1
  13. package/dist/types/advanced/map.d.ts +114 -23
  14. package/dist/types/advanced/map.d.ts.map +1 -1
  15. package/dist/types/advanced/resource.d.ts +51 -12
  16. package/dist/types/advanced/resource.d.ts.map +1 -1
  17. package/dist/types/advanced/resourceAsync.d.ts +28 -13
  18. package/dist/types/advanced/resourceAsync.d.ts.map +1 -1
  19. package/dist/types/advanced/stream.d.ts +74 -16
  20. package/dist/types/advanced/stream.d.ts.map +1 -1
  21. package/dist/types/advanced/streamAsync.d.ts +69 -15
  22. package/dist/types/advanced/streamAsync.d.ts.map +1 -1
  23. package/dist/types/basic/constant.d.ts +44 -16
  24. package/dist/types/basic/constant.d.ts.map +1 -1
  25. package/dist/types/basic/derivation.d.ts +73 -24
  26. package/dist/types/basic/derivation.d.ts.map +1 -1
  27. package/dist/types/basic/disposable.d.ts +65 -6
  28. package/dist/types/basic/disposable.d.ts.map +1 -1
  29. package/dist/types/basic/effect.d.ts +27 -16
  30. package/dist/types/basic/effect.d.ts.map +1 -1
  31. package/dist/types/basic/index.d.ts +7 -8
  32. package/dist/types/basic/index.d.ts.map +1 -1
  33. package/dist/types/basic/observable.d.ts +62 -13
  34. package/dist/types/basic/observable.d.ts.map +1 -1
  35. package/dist/types/basic/signal.d.ts +35 -6
  36. package/dist/types/basic/signal.d.ts.map +1 -1
  37. package/dist/types/basic/state.d.ts +25 -4
  38. package/dist/types/basic/state.d.ts.map +1 -1
  39. package/dist/types/basic/trackingContext.d.ts +33 -0
  40. package/dist/types/basic/trackingContext.d.ts.map +1 -0
  41. package/dist/types/creators.d.ts +271 -26
  42. package/dist/types/creators.d.ts.map +1 -1
  43. package/dist/types/index.d.ts +60 -7
  44. package/dist/types/index.d.ts.map +1 -1
  45. package/dist/types/solid/converters.d.ts +5 -5
  46. package/dist/types/solid/converters.d.ts.map +1 -1
  47. package/dist/types/solid/index.d.ts +2 -2
  48. package/dist/types/solid/index.d.ts.map +1 -1
  49. package/dist/types/solid/primitives.d.ts +96 -4
  50. package/dist/types/solid/primitives.d.ts.map +1 -1
  51. package/docs/.vitepress/config.mts +110 -0
  52. package/docs/api/classes/FlowArray.md +489 -0
  53. package/docs/api/classes/FlowConstant.md +350 -0
  54. package/docs/api/classes/FlowDerivation.md +334 -0
  55. package/docs/api/classes/FlowEffect.md +100 -0
  56. package/docs/api/classes/FlowMap.md +512 -0
  57. package/docs/api/classes/FlowObservable.md +306 -0
  58. package/docs/api/classes/FlowResource.md +380 -0
  59. package/docs/api/classes/FlowResourceAsync.md +362 -0
  60. package/docs/api/classes/FlowSignal.md +160 -0
  61. package/docs/api/classes/FlowState.md +368 -0
  62. package/docs/api/classes/FlowStream.md +367 -0
  63. package/docs/api/classes/FlowStreamAsync.md +364 -0
  64. package/docs/api/classes/SolidDerivation.md +75 -0
  65. package/docs/api/classes/SolidResource.md +91 -0
  66. package/docs/api/classes/SolidState.md +71 -0
  67. package/docs/api/classes/TrackingContext.md +33 -0
  68. package/docs/api/functions/array.md +58 -0
  69. package/docs/api/functions/constant.md +45 -0
  70. package/docs/api/functions/derivation.md +53 -0
  71. package/docs/api/functions/effect.md +49 -0
  72. package/docs/api/functions/from.md +220 -0
  73. package/docs/api/functions/isDisposable.md +49 -0
  74. package/docs/api/functions/map.md +57 -0
  75. package/docs/api/functions/resource.md +52 -0
  76. package/docs/api/functions/resourceAsync.md +50 -0
  77. package/docs/api/functions/signal.md +36 -0
  78. package/docs/api/functions/state.md +47 -0
  79. package/docs/api/functions/stream.md +53 -0
  80. package/docs/api/functions/streamAsync.md +50 -0
  81. package/docs/api/index.md +118 -0
  82. package/docs/api/interfaces/FlowDisposable.md +65 -0
  83. package/docs/api/interfaces/SolidObservable.md +19 -0
  84. package/docs/api/type-aliases/FlowArrayAction.md +49 -0
  85. package/docs/api/type-aliases/FlowStreamDisposer.md +15 -0
  86. package/docs/api/type-aliases/FlowStreamSetter.md +27 -0
  87. package/docs/api/type-aliases/FlowStreamUpdater.md +32 -0
  88. package/docs/api/type-aliases/NotPromise.md +18 -0
  89. package/docs/api/type-aliases/SolidGetter.md +17 -0
  90. package/docs/api/typedoc-sidebar.json +1 -0
  91. package/docs/examples/examples.md +2313 -0
  92. package/docs/examples/patterns.md +649 -0
  93. package/docs/guide/advanced/disposal.md +426 -0
  94. package/docs/guide/advanced/solidjs.md +221 -0
  95. package/docs/guide/advanced/upgrading.md +464 -0
  96. package/docs/guide/introduction/concepts.md +56 -0
  97. package/docs/guide/introduction/conventions.md +61 -0
  98. package/docs/guide/introduction/getting-started.md +134 -0
  99. package/docs/guide/introduction/lifecycle.md +371 -0
  100. package/docs/guide/primitives/array.md +400 -0
  101. package/docs/guide/primitives/constant.md +380 -0
  102. package/docs/guide/primitives/derivations.md +348 -0
  103. package/docs/guide/primitives/effects.md +458 -0
  104. package/docs/guide/primitives/map.md +387 -0
  105. package/docs/guide/primitives/overview.md +175 -0
  106. package/docs/guide/primitives/resources.md +858 -0
  107. package/docs/guide/primitives/signal.md +259 -0
  108. package/docs/guide/primitives/state.md +368 -0
  109. package/docs/guide/primitives/streams.md +931 -0
  110. package/docs/index.md +47 -0
  111. package/docs/public/logo.svg +1 -0
  112. package/package.json +57 -41
  113. package/src/advanced/array.ts +208 -210
  114. package/src/advanced/index.ts +7 -7
  115. package/src/advanced/map.ts +178 -68
  116. package/src/advanced/resource.ts +87 -43
  117. package/src/advanced/resourceAsync.ts +62 -42
  118. package/src/advanced/stream.ts +113 -50
  119. package/src/advanced/streamAsync.ts +120 -61
  120. package/src/basic/constant.ts +82 -49
  121. package/src/basic/derivation.ts +128 -84
  122. package/src/basic/disposable.ts +74 -15
  123. package/src/basic/effect.ts +85 -77
  124. package/src/basic/index.ts +7 -8
  125. package/src/basic/observable.ts +94 -36
  126. package/src/basic/signal.ts +133 -105
  127. package/src/basic/state.ts +46 -25
  128. package/src/basic/trackingContext.ts +45 -0
  129. package/src/creators.ts +297 -54
  130. package/src/index.ts +96 -43
  131. package/src/solid/converters.ts +186 -67
  132. package/src/solid/index.ts +8 -2
  133. package/src/solid/primitives.ts +167 -65
  134. package/test/array.test.ts +592 -612
  135. package/test/constant.test.ts +31 -33
  136. package/test/derivation.test.ts +531 -536
  137. package/test/effect.test.ts +21 -21
  138. package/test/map.test.ts +233 -137
  139. package/test/resource.test.ts +119 -121
  140. package/test/resourceAsync.test.ts +98 -100
  141. package/test/signal.test.ts +51 -55
  142. package/test/state.test.ts +186 -168
  143. package/test/stream.test.ts +189 -189
  144. package/test/streamAsync.test.ts +186 -186
  145. package/tsconfig.json +19 -18
  146. package/typedoc.json +37 -0
  147. package/vite.config.ts +23 -23
  148. package/vitest.config.ts +7 -7
  149. package/api/doc/index.md +0 -31
  150. package/api/doc/picoflow.array.md +0 -55
  151. package/api/doc/picoflow.constant.md +0 -55
  152. package/api/doc/picoflow.derivation.md +0 -55
  153. package/api/doc/picoflow.effect.md +0 -55
  154. package/api/doc/picoflow.flowarray._constructor_.md +0 -49
  155. package/api/doc/picoflow.flowarray._lastaction.md +0 -13
  156. package/api/doc/picoflow.flowarray.clear.md +0 -17
  157. package/api/doc/picoflow.flowarray.dispose.md +0 -55
  158. package/api/doc/picoflow.flowarray.get.md +0 -19
  159. package/api/doc/picoflow.flowarray.length.md +0 -13
  160. package/api/doc/picoflow.flowarray.md +0 -273
  161. package/api/doc/picoflow.flowarray.pop.md +0 -17
  162. package/api/doc/picoflow.flowarray.push.md +0 -53
  163. package/api/doc/picoflow.flowarray.set.md +0 -53
  164. package/api/doc/picoflow.flowarray.setitem.md +0 -69
  165. package/api/doc/picoflow.flowarray.shift.md +0 -17
  166. package/api/doc/picoflow.flowarray.splice.md +0 -85
  167. package/api/doc/picoflow.flowarray.unshift.md +0 -53
  168. package/api/doc/picoflow.flowarrayaction.md +0 -37
  169. package/api/doc/picoflow.flowconstant._constructor_.md +0 -49
  170. package/api/doc/picoflow.flowconstant.get.md +0 -25
  171. package/api/doc/picoflow.flowconstant.md +0 -88
  172. package/api/doc/picoflow.flowderivation._constructor_.md +0 -49
  173. package/api/doc/picoflow.flowderivation.get.md +0 -23
  174. package/api/doc/picoflow.flowderivation.md +0 -86
  175. package/api/doc/picoflow.flowdisposable.dispose.md +0 -55
  176. package/api/doc/picoflow.flowdisposable.md +0 -43
  177. package/api/doc/picoflow.floweffect._constructor_.md +0 -54
  178. package/api/doc/picoflow.floweffect.dispose.md +0 -21
  179. package/api/doc/picoflow.floweffect.disposed.md +0 -13
  180. package/api/doc/picoflow.floweffect.md +0 -131
  181. package/api/doc/picoflow.flowgetter.md +0 -15
  182. package/api/doc/picoflow.flowmap._lastdeleted.md +0 -21
  183. package/api/doc/picoflow.flowmap._lastset.md +0 -21
  184. package/api/doc/picoflow.flowmap.delete.md +0 -61
  185. package/api/doc/picoflow.flowmap.md +0 -133
  186. package/api/doc/picoflow.flowmap.setat.md +0 -77
  187. package/api/doc/picoflow.flowobservable.get.md +0 -19
  188. package/api/doc/picoflow.flowobservable.md +0 -68
  189. package/api/doc/picoflow.flowobservable.subscribe.md +0 -55
  190. package/api/doc/picoflow.flowresource._constructor_.md +0 -49
  191. package/api/doc/picoflow.flowresource.fetch.md +0 -27
  192. package/api/doc/picoflow.flowresource.get.md +0 -23
  193. package/api/doc/picoflow.flowresource.md +0 -100
  194. package/api/doc/picoflow.flowresourceasync._constructor_.md +0 -49
  195. package/api/doc/picoflow.flowresourceasync.fetch.md +0 -27
  196. package/api/doc/picoflow.flowresourceasync.get.md +0 -23
  197. package/api/doc/picoflow.flowresourceasync.md +0 -100
  198. package/api/doc/picoflow.flowsignal.dispose.md +0 -59
  199. package/api/doc/picoflow.flowsignal.disposed.md +0 -18
  200. package/api/doc/picoflow.flowsignal.md +0 -112
  201. package/api/doc/picoflow.flowsignal.trigger.md +0 -21
  202. package/api/doc/picoflow.flowstate.md +0 -52
  203. package/api/doc/picoflow.flowstate.set.md +0 -61
  204. package/api/doc/picoflow.flowstream._constructor_.md +0 -49
  205. package/api/doc/picoflow.flowstream.dispose.md +0 -21
  206. package/api/doc/picoflow.flowstream.get.md +0 -23
  207. package/api/doc/picoflow.flowstream.md +0 -100
  208. package/api/doc/picoflow.flowstreamasync._constructor_.md +0 -54
  209. package/api/doc/picoflow.flowstreamasync.dispose.md +0 -21
  210. package/api/doc/picoflow.flowstreamasync.get.md +0 -23
  211. package/api/doc/picoflow.flowstreamasync.md +0 -100
  212. package/api/doc/picoflow.flowstreamdisposer.md +0 -13
  213. package/api/doc/picoflow.flowstreamsetter.md +0 -13
  214. package/api/doc/picoflow.flowstreamupdater.md +0 -19
  215. package/api/doc/picoflow.flowwatcher.md +0 -15
  216. package/api/doc/picoflow.from.md +0 -55
  217. package/api/doc/picoflow.from_1.md +0 -55
  218. package/api/doc/picoflow.from_2.md +0 -55
  219. package/api/doc/picoflow.from_3.md +0 -55
  220. package/api/doc/picoflow.from_4.md +0 -55
  221. package/api/doc/picoflow.from_5.md +0 -55
  222. package/api/doc/picoflow.isdisposable.md +0 -55
  223. package/api/doc/picoflow.map.md +0 -59
  224. package/api/doc/picoflow.md +0 -544
  225. package/api/doc/picoflow.resource.md +0 -55
  226. package/api/doc/picoflow.resourceasync.md +0 -55
  227. package/api/doc/picoflow.signal.md +0 -19
  228. package/api/doc/picoflow.solidderivation._constructor_.md +0 -49
  229. package/api/doc/picoflow.solidderivation.get.md +0 -13
  230. package/api/doc/picoflow.solidderivation.md +0 -94
  231. package/api/doc/picoflow.solidgetter.md +0 -13
  232. package/api/doc/picoflow.solidobservable.get.md +0 -13
  233. package/api/doc/picoflow.solidobservable.md +0 -57
  234. package/api/doc/picoflow.solidresource._constructor_.md +0 -49
  235. package/api/doc/picoflow.solidresource.get.md +0 -13
  236. package/api/doc/picoflow.solidresource.latest.md +0 -13
  237. package/api/doc/picoflow.solidresource.md +0 -157
  238. package/api/doc/picoflow.solidresource.refetch.md +0 -13
  239. package/api/doc/picoflow.solidresource.state.md +0 -13
  240. package/api/doc/picoflow.solidstate._constructor_.md +0 -49
  241. package/api/doc/picoflow.solidstate.get.md +0 -13
  242. package/api/doc/picoflow.solidstate.md +0 -115
  243. package/api/doc/picoflow.solidstate.set.md +0 -13
  244. package/api/doc/picoflow.state.md +0 -55
  245. package/api/doc/picoflow.stream.md +0 -55
  246. package/api/doc/picoflow.streamasync.md +0 -55
  247. package/api/picoflow.public.api.md +0 -244
  248. package/api-extractor.json +0 -61
@@ -0,0 +1,350 @@
1
+ [@ersbeth/picoflow](/api/index.md) / FlowConstant
2
+
3
+ # Class: FlowConstant\<T\>
4
+
5
+ Defined in: [basic/constant.ts:49](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/constant.ts#L49)
6
+
7
+ Represents a reactive and immutable constant value that can be computed lazily upon first access.
8
+
9
+ ## Remarks
10
+
11
+ FlowConstant extends FlowObservable to provide an immutable reactive value. Unlike [FlowState](/api/classes/FlowState.md),
12
+ which is mutable via the `set()` method, a constant's value never changes after initialization.
13
+
14
+ **Initialization Patterns:**
15
+ - **Direct value**: Pass a value directly; it's stored immediately.
16
+ - **Lazy initialization**: Pass a function; it's called only when the value is first accessed
17
+ via `get()` or `pick()`.
18
+
19
+ **Lazy Evaluation Benefits:**
20
+ Lazy initialization is useful when:
21
+ - The computation is expensive and may not be needed immediately
22
+ - The value depends on resources that aren't available at construction time
23
+ - You want to defer computation until the value is actually needed
24
+
25
+ **Caching:**
26
+ Once computed (either immediately or lazily), the value is cached permanently. All subsequent
27
+ accesses return the cached value without re-computation.
28
+
29
+ **Use Cases:**
30
+ - Configuration values that don't change
31
+ - Expensive computations that should only run once
32
+ - Initialization values for other reactive primitives
33
+
34
+ ## Example
35
+
36
+ ```typescript
37
+ // Direct value - initialized immediately
38
+ const $config = constant({ apiUrl: 'https://api.example.com' });
39
+
40
+ // Lazy initialization - computed on first access
41
+ const $expensiveValue = constant(() => {
42
+ console.log('Computing...');
43
+ return performExpensiveCalculation();
44
+ });
45
+
46
+ $expensiveValue.pick(); // Logs: "Computing..."
47
+ $expensiveValue.pick(); // No log - returns cached value
48
+ ```
49
+
50
+ ## Extends
51
+
52
+ - [`FlowObservable`](/api/classes/FlowObservable.md)\<`T`\>
53
+
54
+ ## Extended by
55
+
56
+ - [`FlowState`](/api/classes/FlowState.md)
57
+
58
+ ## Type Parameters
59
+
60
+ | Type Parameter | Description |
61
+ | ------ | ------ |
62
+ | `T` | The type of the constant value. |
63
+
64
+ ## Constructors
65
+
66
+ ### Constructor
67
+
68
+ ```ts
69
+ new FlowConstant<T>(value): FlowConstant<T>;
70
+ ```
71
+
72
+ Defined in: [basic/constant.ts:59](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/constant.ts#L59)
73
+
74
+ Creates a new FlowConstant instance.
75
+
76
+ #### Parameters
77
+
78
+ | Parameter | Type | Description |
79
+ | ------ | ------ | ------ |
80
+ | `value` | `T` \| () => `T` | Either a direct value of type T or a function returning a value of type T. If a function is provided, it will be invoked lazily on the first value access. If a direct value is provided, it is stored immediately. |
81
+
82
+ #### Returns
83
+
84
+ `FlowConstant`\<`T`\>
85
+
86
+ #### Overrides
87
+
88
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`constructor`](/api/classes/FlowObservable.md#constructor)
89
+
90
+ ## Accessors
91
+
92
+ ### disposed
93
+
94
+ #### Get Signature
95
+
96
+ ```ts
97
+ get disposed(): boolean;
98
+ ```
99
+
100
+ Defined in: [basic/signal.ts:97](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L97)
101
+
102
+ Indicates whether the FlowSignal has been disposed.
103
+
104
+ ##### Remarks
105
+
106
+ Once disposed, the signal should not be used.
107
+
108
+ ##### Returns
109
+
110
+ `boolean`
111
+
112
+ #### Inherited from
113
+
114
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`disposed`](/api/classes/FlowObservable.md#disposed)
115
+
116
+ ## Methods
117
+
118
+ ### dispose()
119
+
120
+ ```ts
121
+ dispose(options?): void;
122
+ ```
123
+
124
+ Defined in: [basic/signal.ts:69](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L69)
125
+
126
+ Disposes the FlowSignal.
127
+ Cleans up all registered effects, listeners, and dependencies.
128
+ Once disposed, further usage of the signal will throw an error.
129
+
130
+ #### Parameters
131
+
132
+ | Parameter | Type |
133
+ | ------ | ------ |
134
+ | `options?` | \{ `self`: `boolean`; \} |
135
+ | `options.self?` | `boolean` |
136
+
137
+ #### Returns
138
+
139
+ `void`
140
+
141
+ #### Throws
142
+
143
+ If the FlowSignal is already disposed.
144
+
145
+ #### Inherited from
146
+
147
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`dispose`](/api/classes/FlowObservable.md#dispose)
148
+
149
+ ***
150
+
151
+ ### get()
152
+
153
+ ```ts
154
+ get(context): T;
155
+ ```
156
+
157
+ Defined in: [basic/observable.ts:47](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L47)
158
+
159
+ Gets the current value with optional dependency tracking.
160
+
161
+ #### Parameters
162
+
163
+ | Parameter | Type | Description |
164
+ | ------ | ------ | ------ |
165
+ | `context` | [`TrackingContext`](/api/classes/TrackingContext.md) \| `null` | The tracking context for reactive tracking, or null for untracked access. When a context is provided, this observable is registered as a dependency. When null, the value is read without any tracking. |
166
+
167
+ #### Returns
168
+
169
+ `T`
170
+
171
+ The current value of type T.
172
+
173
+ #### Remarks
174
+
175
+ Use `get(t)` within effects and derivations to create reactive dependencies.
176
+ Use `get(null)` when you need to read a value without tracking (though `pick()` is more idiomatic).
177
+
178
+ #### Example
179
+
180
+ ```typescript
181
+ effect((t) => {
182
+ const tracked = $state.get(t); // Dependency registered
183
+ const untracked = $other.get(null); // No dependency
184
+ });
185
+ ```
186
+
187
+ #### Inherited from
188
+
189
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`get`](/api/classes/FlowObservable.md#get)
190
+
191
+ ***
192
+
193
+ ### pick()
194
+
195
+ ```ts
196
+ pick(): T;
197
+ ```
198
+
199
+ Defined in: [basic/observable.ts:82](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L82)
200
+
201
+ Gets the current value without any dependency tracking.
202
+
203
+ #### Returns
204
+
205
+ `T`
206
+
207
+ The current value of type T.
208
+
209
+ #### Remarks
210
+
211
+ This method is equivalent to calling `get(null)` but provides a more semantic and readable API.
212
+ Use `pick()` when you want to read a snapshot of the current value without creating a reactive
213
+ dependency. This is useful for:
214
+ - Reading initial values
215
+ - Accessing configuration that shouldn't trigger updates
216
+ - Mixing tracked and untracked reads in the same effect
217
+
218
+ #### Example
219
+
220
+ ```typescript
221
+ // Read a snapshot outside reactive context
222
+ const currentValue = $state.pick();
223
+
224
+ // Mix tracked and untracked reads
225
+ effect((t) => {
226
+ const tracked = $reactive.get(t); // Triggers re-runs
227
+ const snapshot = $config.pick(); // Doesn't trigger re-runs
228
+ processData(tracked, snapshot);
229
+ });
230
+ ```
231
+
232
+ #### Inherited from
233
+
234
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`pick`](/api/classes/FlowObservable.md#pick)
235
+
236
+ ***
237
+
238
+ ### subscribe()
239
+
240
+ ```ts
241
+ subscribe(listener): () => void;
242
+ ```
243
+
244
+ Defined in: [basic/observable.ts:103](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L103)
245
+
246
+ Subscribes a listener function to changes of the observable.
247
+ The listener is executed immediately with the current value and on subsequent updates.
248
+
249
+ #### Parameters
250
+
251
+ | Parameter | Type | Description |
252
+ | ------ | ------ | ------ |
253
+ | `listener` | (`value`) => `void` | A callback function that receives the new value. |
254
+
255
+ #### Returns
256
+
257
+ A disposer function to cancel the subscription.
258
+
259
+ ```ts
260
+ (): void;
261
+ ```
262
+
263
+ ##### Returns
264
+
265
+ `void`
266
+
267
+ #### Inherited from
268
+
269
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`subscribe`](/api/classes/FlowObservable.md#subscribe)
270
+
271
+ ***
272
+
273
+ ### trigger()
274
+
275
+ ```ts
276
+ trigger(): void;
277
+ ```
278
+
279
+ Defined in: [basic/signal.ts:19](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L19)
280
+
281
+ Triggers the FlowSignal.
282
+ Notifies all registered listeners and schedules execution of associated effects.
283
+
284
+ #### Returns
285
+
286
+ `void`
287
+
288
+ #### Throws
289
+
290
+ If the FlowSignal has already been disposed.
291
+
292
+ #### Inherited from
293
+
294
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`trigger`](/api/classes/FlowObservable.md#trigger)
295
+
296
+ ***
297
+
298
+ ### watch()
299
+
300
+ ```ts
301
+ watch(context): void;
302
+ ```
303
+
304
+ Defined in: [basic/signal.ts:57](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L57)
305
+
306
+ Watches the signal, registering it as a dependency in the tracking context.
307
+
308
+ #### Parameters
309
+
310
+ | Parameter | Type | Description |
311
+ | ------ | ------ | ------ |
312
+ | `context` | [`TrackingContext`](/api/classes/TrackingContext.md) | The tracking context in which to register this signal as a dependency. |
313
+
314
+ #### Returns
315
+
316
+ `void`
317
+
318
+ #### Remarks
319
+
320
+ Use `watch()` when you want to track a signal without reading its value (signals don't
321
+ have values to read). This is useful for triggering effects based on signal events
322
+ without needing associated data.
323
+
324
+ When the signal is triggered via `trigger()`, any effects or derivations that have
325
+ watched this signal will automatically re-execute.
326
+
327
+ This method must be called within an effect or derivation context where a TrackingContext
328
+ is available. For observables (which hold values), use `.get(t)` instead, which both
329
+ reads the value and watches for changes.
330
+
331
+ #### Throws
332
+
333
+ Error if the signal has been disposed.
334
+
335
+ #### Example
336
+
337
+ ```typescript
338
+ const $signal = signal();
339
+
340
+ effect((t) => {
341
+ $signal.watch(t); // Track the signal
342
+ console.log('Signal triggered!');
343
+ });
344
+
345
+ $signal.trigger(); // Logs: "Signal triggered!"
346
+ ```
347
+
348
+ #### Inherited from
349
+
350
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`watch`](/api/classes/FlowObservable.md#watch)
@@ -0,0 +1,334 @@
1
+ [@ersbeth/picoflow](/api/index.md) / FlowDerivation
2
+
3
+ # Class: FlowDerivation\<T\>
4
+
5
+ Defined in: [basic/derivation.ts:43](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/derivation.ts#L43)
6
+
7
+ Represents a reactive derivation whose value is computed based on other reactive signals.
8
+
9
+ ## Remarks
10
+
11
+ FlowDerivation creates a computed value that automatically tracks its dependencies and
12
+ recomputes when any dependency changes. The computation is lazy: it doesn't execute until
13
+ the value is first accessed (via `get()` or `pick()`), and subsequent accesses return the
14
+ cached value until a dependency changes.
15
+
16
+ **Lazy Initialization:**
17
+ The compute function doesn't run immediately upon creation. It runs only when:
18
+ - The value is first read via `get()` or `pick()`
19
+ - The derivation is watched via `watch()`
20
+
21
+ **Dirty Checking and Recomputation:**
22
+ When a tracked dependency changes, the derivation is marked as "dirty" but doesn't recompute
23
+ immediately. Recomputation happens lazily on the next value access. This prevents unnecessary
24
+ computations when multiple dependencies change in quick succession.
25
+
26
+ **Dynamic Dependencies:**
27
+ Dependencies are tracked dynamically during each computation. If the compute function
28
+ conditionally tracks different observables, the dependency graph updates automatically.
29
+
30
+ ## Example
31
+
32
+ ```typescript
33
+ const $firstName = state('John');
34
+ const $lastName = state('Doe');
35
+
36
+ const $fullName = derivation((t) => {
37
+ return `${$firstName.get(t)} ${$lastName.get(t)}`;
38
+ });
39
+
40
+ // Compute function hasn't run yet (lazy)
41
+ const name = $fullName.pick(); // Now it computes
42
+ ```
43
+
44
+ ## Extends
45
+
46
+ - [`FlowObservable`](/api/classes/FlowObservable.md)\<`T`\>
47
+
48
+ ## Type Parameters
49
+
50
+ | Type Parameter | Description |
51
+ | ------ | ------ |
52
+ | `T` | The type of the computed value. |
53
+
54
+ ## Constructors
55
+
56
+ ### Constructor
57
+
58
+ ```ts
59
+ new FlowDerivation<T>(compute): FlowDerivation<T>;
60
+ ```
61
+
62
+ Defined in: [basic/derivation.ts:53](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/derivation.ts#L53)
63
+
64
+ Creates a new FlowDerivation.
65
+
66
+ #### Parameters
67
+
68
+ | Parameter | Type | Description |
69
+ | ------ | ------ | ------ |
70
+ | `compute` | (`t`) => `T` | A function that computes the derived value using a tracking context. The function receives a TrackingContext and should use it to access dependencies via `.get(t)`. The function is not executed immediately; it runs lazily on first access. |
71
+
72
+ #### Returns
73
+
74
+ `FlowDerivation`\<`T`\>
75
+
76
+ #### Overrides
77
+
78
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`constructor`](/api/classes/FlowObservable.md#constructor)
79
+
80
+ ## Accessors
81
+
82
+ ### disposed
83
+
84
+ #### Get Signature
85
+
86
+ ```ts
87
+ get disposed(): boolean;
88
+ ```
89
+
90
+ Defined in: [basic/signal.ts:97](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L97)
91
+
92
+ Indicates whether the FlowSignal has been disposed.
93
+
94
+ ##### Remarks
95
+
96
+ Once disposed, the signal should not be used.
97
+
98
+ ##### Returns
99
+
100
+ `boolean`
101
+
102
+ #### Inherited from
103
+
104
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`disposed`](/api/classes/FlowObservable.md#disposed)
105
+
106
+ ## Methods
107
+
108
+ ### dispose()
109
+
110
+ ```ts
111
+ dispose(options?): void;
112
+ ```
113
+
114
+ Defined in: [basic/signal.ts:69](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L69)
115
+
116
+ Disposes the FlowSignal.
117
+ Cleans up all registered effects, listeners, and dependencies.
118
+ Once disposed, further usage of the signal will throw an error.
119
+
120
+ #### Parameters
121
+
122
+ | Parameter | Type |
123
+ | ------ | ------ |
124
+ | `options?` | \{ `self`: `boolean`; \} |
125
+ | `options.self?` | `boolean` |
126
+
127
+ #### Returns
128
+
129
+ `void`
130
+
131
+ #### Throws
132
+
133
+ If the FlowSignal is already disposed.
134
+
135
+ #### Inherited from
136
+
137
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`dispose`](/api/classes/FlowObservable.md#dispose)
138
+
139
+ ***
140
+
141
+ ### get()
142
+
143
+ ```ts
144
+ get(context): T;
145
+ ```
146
+
147
+ Defined in: [basic/observable.ts:47](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L47)
148
+
149
+ Gets the current value with optional dependency tracking.
150
+
151
+ #### Parameters
152
+
153
+ | Parameter | Type | Description |
154
+ | ------ | ------ | ------ |
155
+ | `context` | [`TrackingContext`](/api/classes/TrackingContext.md) \| `null` | The tracking context for reactive tracking, or null for untracked access. When a context is provided, this observable is registered as a dependency. When null, the value is read without any tracking. |
156
+
157
+ #### Returns
158
+
159
+ `T`
160
+
161
+ The current value of type T.
162
+
163
+ #### Remarks
164
+
165
+ Use `get(t)` within effects and derivations to create reactive dependencies.
166
+ Use `get(null)` when you need to read a value without tracking (though `pick()` is more idiomatic).
167
+
168
+ #### Example
169
+
170
+ ```typescript
171
+ effect((t) => {
172
+ const tracked = $state.get(t); // Dependency registered
173
+ const untracked = $other.get(null); // No dependency
174
+ });
175
+ ```
176
+
177
+ #### Inherited from
178
+
179
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`get`](/api/classes/FlowObservable.md#get)
180
+
181
+ ***
182
+
183
+ ### pick()
184
+
185
+ ```ts
186
+ pick(): T;
187
+ ```
188
+
189
+ Defined in: [basic/observable.ts:82](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L82)
190
+
191
+ Gets the current value without any dependency tracking.
192
+
193
+ #### Returns
194
+
195
+ `T`
196
+
197
+ The current value of type T.
198
+
199
+ #### Remarks
200
+
201
+ This method is equivalent to calling `get(null)` but provides a more semantic and readable API.
202
+ Use `pick()` when you want to read a snapshot of the current value without creating a reactive
203
+ dependency. This is useful for:
204
+ - Reading initial values
205
+ - Accessing configuration that shouldn't trigger updates
206
+ - Mixing tracked and untracked reads in the same effect
207
+
208
+ #### Example
209
+
210
+ ```typescript
211
+ // Read a snapshot outside reactive context
212
+ const currentValue = $state.pick();
213
+
214
+ // Mix tracked and untracked reads
215
+ effect((t) => {
216
+ const tracked = $reactive.get(t); // Triggers re-runs
217
+ const snapshot = $config.pick(); // Doesn't trigger re-runs
218
+ processData(tracked, snapshot);
219
+ });
220
+ ```
221
+
222
+ #### Inherited from
223
+
224
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`pick`](/api/classes/FlowObservable.md#pick)
225
+
226
+ ***
227
+
228
+ ### subscribe()
229
+
230
+ ```ts
231
+ subscribe(listener): () => void;
232
+ ```
233
+
234
+ Defined in: [basic/observable.ts:103](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L103)
235
+
236
+ Subscribes a listener function to changes of the observable.
237
+ The listener is executed immediately with the current value and on subsequent updates.
238
+
239
+ #### Parameters
240
+
241
+ | Parameter | Type | Description |
242
+ | ------ | ------ | ------ |
243
+ | `listener` | (`value`) => `void` | A callback function that receives the new value. |
244
+
245
+ #### Returns
246
+
247
+ A disposer function to cancel the subscription.
248
+
249
+ ```ts
250
+ (): void;
251
+ ```
252
+
253
+ ##### Returns
254
+
255
+ `void`
256
+
257
+ #### Inherited from
258
+
259
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`subscribe`](/api/classes/FlowObservable.md#subscribe)
260
+
261
+ ***
262
+
263
+ ### trigger()
264
+
265
+ ```ts
266
+ trigger(): void;
267
+ ```
268
+
269
+ Defined in: [basic/signal.ts:19](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L19)
270
+
271
+ Triggers the FlowSignal.
272
+ Notifies all registered listeners and schedules execution of associated effects.
273
+
274
+ #### Returns
275
+
276
+ `void`
277
+
278
+ #### Throws
279
+
280
+ If the FlowSignal has already been disposed.
281
+
282
+ #### Inherited from
283
+
284
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`trigger`](/api/classes/FlowObservable.md#trigger)
285
+
286
+ ***
287
+
288
+ ### watch()
289
+
290
+ ```ts
291
+ watch(context): void;
292
+ ```
293
+
294
+ Defined in: [basic/derivation.ts:139](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/derivation.ts#L139)
295
+
296
+ Watches the derivation, registering it as a dependency in the given context.
297
+
298
+ #### Parameters
299
+
300
+ | Parameter | Type | Description |
301
+ | ------ | ------ | ------ |
302
+ | `context` | [`TrackingContext`](/api/classes/TrackingContext.md) | The tracking context in which to register this derivation. |
303
+
304
+ #### Returns
305
+
306
+ `void`
307
+
308
+ #### Remarks
309
+
310
+ This method overrides the base `watch()` to handle a special case: when a derivation
311
+ is watched without having its value read (e.g., `$derivation.watch(t)` instead of
312
+ `$derivation.get(t)`), the derivation still needs to compute its value to establish
313
+ its own dependencies. Otherwise, the derivation would be tracked but wouldn't track
314
+ its own dependencies, breaking the reactive chain.
315
+
316
+ This override ensures that:
317
+ 1. The derivation is registered as a dependency in the provided context
318
+ 2. The derivation computes its value (if not already computed)
319
+ 3. The derivation tracks its own dependencies during computation
320
+
321
+ #### Example
322
+
323
+ ```typescript
324
+ const $derived = derivation((t) => $state.get(t) * 2);
325
+
326
+ effect((t) => {
327
+ $derived.watch(t); // Derivation computes even without reading value
328
+ doSomething(); // Effect re-runs when $derived's dependencies change
329
+ });
330
+ ```
331
+
332
+ #### Overrides
333
+
334
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`watch`](/api/classes/FlowObservable.md#watch)