@ersbeth/picoflow 0.2.4 → 1.0.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 (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 +62 -25
  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,364 @@
1
+ [@ersbeth/picoflow](/api/index.md) / FlowStreamAsync
2
+
3
+ # Class: FlowStreamAsync\<T\>
4
+
5
+ Defined in: [advanced/streamAsync.ts:69](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/advanced/streamAsync.ts#L69)
6
+
7
+ Represents an asynchronous reactive stream that always returns a Promise and updates based on an updater function.
8
+
9
+ ## Remarks
10
+
11
+ FlowStreamAsync extends FlowObservable to bridge external async event sources with PicoFlow's
12
+ reactive system. Unlike [FlowStream](/api/classes/FlowStream.md) which returns `T | undefined`, FlowStreamAsync always
13
+ returns a `Promise<T>`, making it suitable for use with async/await patterns.
14
+
15
+ **How It Works:**
16
+ 1. On construction, creates an initial Promise that resolves when the first value arrives
17
+ 2. Your updater function receives a setter callback and sets up event subscriptions
18
+ 3. When the setter is called with a value, the Promise resolves (first call) or a new Promise is created (subsequent calls)
19
+ 4. The updater returns a disposer function for cleanup
20
+
21
+ **Promise Behavior:**
22
+ - **First call to setter**: Resolves the initial Promise created at construction
23
+ - **Subsequent calls**: Creates a new `Promise.resolve(value)` for immediate resolution
24
+ - **Reading the value**: Always returns a Promise, either pending (initial) or resolved
25
+
26
+ **Change Detection:**
27
+ After the first value is set, the stream only notifies subscribers when the new value
28
+ differs from the previous value (using strict equality `===`). This prevents unnecessary
29
+ updates for duplicate values.
30
+
31
+ **Resource Management:**
32
+ The disposer function returned by your updater is automatically called when the stream
33
+ is disposed. Use it to clean up subscriptions, close connections, or clear timers.
34
+
35
+ **Use Cases:**
36
+ - Async WebSocket message streams
37
+ - Server-sent events that you want to await
38
+ - Async event handlers
39
+ - Integration with async iterators
40
+ - Any push-based async data source
41
+
42
+ ## Example
43
+
44
+ ```typescript
45
+ // Async WebSocket stream
46
+ const $messages = streamAsync<string>((set) => {
47
+ const ws = new WebSocket('ws://example.com');
48
+ ws.onmessage = (event) => set(event.data);
49
+ return () => ws.close();
50
+ });
51
+
52
+ // Use with async/await
53
+ effect(async (t) => {
54
+ const message = await $messages.get(t);
55
+ console.log('Received:', message);
56
+ });
57
+
58
+ // Wait for the first message
59
+ const firstMessage = await $messages.pick();
60
+ console.log('First message:', firstMessage);
61
+
62
+ // Async timer stream
63
+ const $asyncTick = streamAsync<number>((set) => {
64
+ let count = 0;
65
+ const id = setInterval(() => set(count++), 1000);
66
+ return () => clearInterval(id);
67
+ });
68
+ ```
69
+
70
+ ## Extends
71
+
72
+ - [`FlowObservable`](/api/classes/FlowObservable.md)\<`Promise`\<`T`\>\>
73
+
74
+ ## Type Parameters
75
+
76
+ | Type Parameter | Description |
77
+ | ------ | ------ |
78
+ | `T` | The type of the values emitted by the stream (not the Promise itself). |
79
+
80
+ ## Constructors
81
+
82
+ ### Constructor
83
+
84
+ ```ts
85
+ new FlowStreamAsync<T>(updater): FlowStreamAsync<T>;
86
+ ```
87
+
88
+ Defined in: [advanced/streamAsync.ts:84](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/advanced/streamAsync.ts#L84)
89
+
90
+ Creates a new asynchronous FlowStream.
91
+
92
+ #### Parameters
93
+
94
+ | Parameter | Type | Description |
95
+ | ------ | ------ | ------ |
96
+ | `updater` | [`FlowStreamUpdater`](/api/type-aliases/FlowStreamUpdater.md)\<`T`\> | A function that receives a setter callback and returns a disposer. The setter should be called whenever new data is available (can be called asynchronously). The disposer will be invoked when the stream is disposed to clean up resources. |
97
+
98
+ #### Returns
99
+
100
+ `FlowStreamAsync`\<`T`\>
101
+
102
+ #### Remarks
103
+
104
+ The updater is invoked immediately during construction. An initial Promise is created
105
+ that will resolve when the setter is first called. Make sure to return a proper cleanup
106
+ function to avoid resource leaks.
107
+
108
+ #### Overrides
109
+
110
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`constructor`](/api/classes/FlowObservable.md#constructor)
111
+
112
+ ## Accessors
113
+
114
+ ### disposed
115
+
116
+ #### Get Signature
117
+
118
+ ```ts
119
+ get disposed(): boolean;
120
+ ```
121
+
122
+ Defined in: [basic/signal.ts:97](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L97)
123
+
124
+ Indicates whether the FlowSignal has been disposed.
125
+
126
+ ##### Remarks
127
+
128
+ Once disposed, the signal should not be used.
129
+
130
+ ##### Returns
131
+
132
+ `boolean`
133
+
134
+ #### Inherited from
135
+
136
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`disposed`](/api/classes/FlowObservable.md#disposed)
137
+
138
+ ## Methods
139
+
140
+ ### dispose()
141
+
142
+ ```ts
143
+ dispose(): void;
144
+ ```
145
+
146
+ Defined in: [advanced/streamAsync.ts:110](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/advanced/streamAsync.ts#L110)
147
+
148
+ Disposes the stream, releasing all resources.
149
+
150
+ #### Returns
151
+
152
+ `void`
153
+
154
+ #### Remarks
155
+
156
+ In addition to disposing the underlying observable, this method calls the disposer
157
+ returned by the updater.
158
+
159
+ #### Overrides
160
+
161
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`dispose`](/api/classes/FlowObservable.md#dispose)
162
+
163
+ ***
164
+
165
+ ### get()
166
+
167
+ ```ts
168
+ get(context): Promise;
169
+ ```
170
+
171
+ Defined in: [basic/observable.ts:47](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L47)
172
+
173
+ Gets the current value with optional dependency tracking.
174
+
175
+ #### Parameters
176
+
177
+ | Parameter | Type | Description |
178
+ | ------ | ------ | ------ |
179
+ | `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. |
180
+
181
+ #### Returns
182
+
183
+ `Promise`
184
+
185
+ The current value of type T.
186
+
187
+ #### Remarks
188
+
189
+ Use `get(t)` within effects and derivations to create reactive dependencies.
190
+ Use `get(null)` when you need to read a value without tracking (though `pick()` is more idiomatic).
191
+
192
+ #### Example
193
+
194
+ ```typescript
195
+ effect((t) => {
196
+ const tracked = $state.get(t); // Dependency registered
197
+ const untracked = $other.get(null); // No dependency
198
+ });
199
+ ```
200
+
201
+ #### Inherited from
202
+
203
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`get`](/api/classes/FlowObservable.md#get)
204
+
205
+ ***
206
+
207
+ ### pick()
208
+
209
+ ```ts
210
+ pick(): Promise;
211
+ ```
212
+
213
+ Defined in: [basic/observable.ts:82](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L82)
214
+
215
+ Gets the current value without any dependency tracking.
216
+
217
+ #### Returns
218
+
219
+ `Promise`
220
+
221
+ The current value of type T.
222
+
223
+ #### Remarks
224
+
225
+ This method is equivalent to calling `get(null)` but provides a more semantic and readable API.
226
+ Use `pick()` when you want to read a snapshot of the current value without creating a reactive
227
+ dependency. This is useful for:
228
+ - Reading initial values
229
+ - Accessing configuration that shouldn't trigger updates
230
+ - Mixing tracked and untracked reads in the same effect
231
+
232
+ #### Example
233
+
234
+ ```typescript
235
+ // Read a snapshot outside reactive context
236
+ const currentValue = $state.pick();
237
+
238
+ // Mix tracked and untracked reads
239
+ effect((t) => {
240
+ const tracked = $reactive.get(t); // Triggers re-runs
241
+ const snapshot = $config.pick(); // Doesn't trigger re-runs
242
+ processData(tracked, snapshot);
243
+ });
244
+ ```
245
+
246
+ #### Inherited from
247
+
248
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`pick`](/api/classes/FlowObservable.md#pick)
249
+
250
+ ***
251
+
252
+ ### subscribe()
253
+
254
+ ```ts
255
+ subscribe(listener): () => void;
256
+ ```
257
+
258
+ Defined in: [basic/observable.ts:103](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/observable.ts#L103)
259
+
260
+ Subscribes a listener function to changes of the observable.
261
+ The listener is executed immediately with the current value and on subsequent updates.
262
+
263
+ #### Parameters
264
+
265
+ | Parameter | Type | Description |
266
+ | ------ | ------ | ------ |
267
+ | `listener` | (`value`) => `void` | A callback function that receives the new value. |
268
+
269
+ #### Returns
270
+
271
+ A disposer function to cancel the subscription.
272
+
273
+ ```ts
274
+ (): void;
275
+ ```
276
+
277
+ ##### Returns
278
+
279
+ `void`
280
+
281
+ #### Inherited from
282
+
283
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`subscribe`](/api/classes/FlowObservable.md#subscribe)
284
+
285
+ ***
286
+
287
+ ### trigger()
288
+
289
+ ```ts
290
+ trigger(): void;
291
+ ```
292
+
293
+ Defined in: [basic/signal.ts:19](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L19)
294
+
295
+ Triggers the FlowSignal.
296
+ Notifies all registered listeners and schedules execution of associated effects.
297
+
298
+ #### Returns
299
+
300
+ `void`
301
+
302
+ #### Throws
303
+
304
+ If the FlowSignal has already been disposed.
305
+
306
+ #### Inherited from
307
+
308
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`trigger`](/api/classes/FlowObservable.md#trigger)
309
+
310
+ ***
311
+
312
+ ### watch()
313
+
314
+ ```ts
315
+ watch(context): void;
316
+ ```
317
+
318
+ Defined in: [basic/signal.ts:57](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/signal.ts#L57)
319
+
320
+ Watches the signal, registering it as a dependency in the tracking context.
321
+
322
+ #### Parameters
323
+
324
+ | Parameter | Type | Description |
325
+ | ------ | ------ | ------ |
326
+ | `context` | [`TrackingContext`](/api/classes/TrackingContext.md) | The tracking context in which to register this signal as a dependency. |
327
+
328
+ #### Returns
329
+
330
+ `void`
331
+
332
+ #### Remarks
333
+
334
+ Use `watch()` when you want to track a signal without reading its value (signals don't
335
+ have values to read). This is useful for triggering effects based on signal events
336
+ without needing associated data.
337
+
338
+ When the signal is triggered via `trigger()`, any effects or derivations that have
339
+ watched this signal will automatically re-execute.
340
+
341
+ This method must be called within an effect or derivation context where a TrackingContext
342
+ is available. For observables (which hold values), use `.get(t)` instead, which both
343
+ reads the value and watches for changes.
344
+
345
+ #### Throws
346
+
347
+ Error if the signal has been disposed.
348
+
349
+ #### Example
350
+
351
+ ```typescript
352
+ const $signal = signal();
353
+
354
+ effect((t) => {
355
+ $signal.watch(t); // Track the signal
356
+ console.log('Signal triggered!');
357
+ });
358
+
359
+ $signal.trigger(); // Logs: "Signal triggered!"
360
+ ```
361
+
362
+ #### Inherited from
363
+
364
+ [`FlowObservable`](/api/classes/FlowObservable.md).[`watch`](/api/classes/FlowObservable.md#watch)
@@ -0,0 +1,75 @@
1
+ [@ersbeth/picoflow](/api/index.md) / SolidDerivation
2
+
3
+ # Class: SolidDerivation\<T\>
4
+
5
+ Defined in: [solid/primitives.ts:114](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L114)
6
+
7
+ Solid-style derivation wrapping SolidJS's createMemo, providing a computed reactive value.
8
+
9
+ ## Remarks
10
+
11
+ SolidDerivation is a thin wrapper around SolidJS's `createMemo` that provides a class-based
12
+ interface consistent with PicoFlow's API style. It creates a memoized computation that
13
+ automatically tracks its dependencies and recomputes only when they change.
14
+
15
+ Unlike PicoFlow's [FlowDerivation](/api/classes/FlowDerivation.md) which uses explicit tracking context, SolidDerivation
16
+ relies on SolidJS's automatic dependency tracking. The computation function runs within
17
+ SolidJS's reactive scope and automatically subscribes to any signals accessed during execution.
18
+
19
+ **Memoization:**
20
+ The computed value is cached and only recomputed when tracked dependencies change,
21
+ providing efficient derived state management.
22
+
23
+ ## Example
24
+
25
+ ```typescript
26
+ const firstName = new SolidState('John');
27
+ const lastName = new SolidState('Doe');
28
+
29
+ const fullName = new SolidDerivation(() => {
30
+ return `${firstName.get()} ${lastName.get()}`;
31
+ });
32
+
33
+ // In a Solid component
34
+ function Display() {
35
+ return <div>{fullName.get()}</div>; // Automatically updates
36
+ }
37
+ ```
38
+
39
+ ## Type Parameters
40
+
41
+ | Type Parameter | Description |
42
+ | ------ | ------ |
43
+ | `T` | The value type. |
44
+
45
+ ## Implements
46
+
47
+ - [`SolidObservable`](/api/interfaces/SolidObservable.md)\<`T`\>
48
+
49
+ ## Constructors
50
+
51
+ ### Constructor
52
+
53
+ ```ts
54
+ new SolidDerivation<T>(calculator): SolidDerivation<T>;
55
+ ```
56
+
57
+ Defined in: [solid/primitives.ts:124](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L124)
58
+
59
+ Creates a new SolidDerivation from a getter function or value.
60
+
61
+ #### Parameters
62
+
63
+ | Parameter | Type | Description |
64
+ | ------ | ------ | ------ |
65
+ | `calculator` | [`SolidGetter`](/api/type-aliases/SolidGetter.md)\<`T`\> | The getter function or value. |
66
+
67
+ #### Returns
68
+
69
+ `SolidDerivation`\<`T`\>
70
+
71
+ ## Properties
72
+
73
+ | Property | Modifier | Type | Description | Defined in |
74
+ | ------ | ------ | ------ | ------ | ------ |
75
+ | <a id="get"></a> `get` | `readonly` | () => `T` | Returns the current derived value. | [solid/primitives.ts:118](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L118) |
@@ -0,0 +1,91 @@
1
+ [@ersbeth/picoflow](/api/index.md) / SolidResource
2
+
3
+ # Class: SolidResource\<T\>
4
+
5
+ Defined in: [solid/primitives.ts:177](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L177)
6
+
7
+ Solid-style resource wrapping SolidJS's createResource, providing async data loading with reactive state.
8
+
9
+ ## Remarks
10
+
11
+ SolidResource is a thin wrapper around SolidJS's `createResource` that provides a class-based
12
+ interface consistent with PicoFlow's API style. It manages asynchronous data fetching with
13
+ built-in loading states, error handling, and automatic reactivity.
14
+
15
+ Unlike PicoFlow's [FlowResource](/api/classes/FlowResource.md) or [FlowResourceAsync](/api/classes/FlowResourceAsync.md), SolidResource integrates
16
+ directly with SolidJS's Suspense and ErrorBoundary mechanisms, providing a first-class async
17
+ data loading experience in Solid applications.
18
+
19
+ **Resource States:**
20
+ - `unresolved`: Initial state before first fetch
21
+ - `pending`: Fetch is in progress
22
+ - `ready`: Data has been successfully loaded
23
+ - `refreshing`: Refetching while previous data is still available
24
+ - `errored`: Fetch failed with an error
25
+
26
+ **Properties:**
27
+ - `get()`: Returns the current value (or undefined if not ready)
28
+ - `state()`: Returns the current loading state
29
+ - `latest()`: Returns the most recent successfully loaded value
30
+ - `refetch()`: Triggers a new fetch operation
31
+
32
+ ## Example
33
+
34
+ ```typescript
35
+ const user = new SolidResource(async () => {
36
+ const res = await fetch('/api/user');
37
+ return res.json();
38
+ });
39
+
40
+ // In a Solid component
41
+ function UserProfile() {
42
+ return (
43
+ <div>
44
+ {user.state() === 'pending' && <p>Loading...</p>}
45
+ {user.state() === 'ready' && <p>Name: {user.get()?.name}</p>}
46
+ <button onClick={() => user.refetch()}>Refresh</button>
47
+ </div>
48
+ );
49
+ }
50
+ ```
51
+
52
+ ## Type Parameters
53
+
54
+ | Type Parameter | Description |
55
+ | ------ | ------ |
56
+ | `T` | The value type. |
57
+
58
+ ## Implements
59
+
60
+ - [`SolidObservable`](/api/interfaces/SolidObservable.md)\<`T` \| `undefined`\>
61
+
62
+ ## Constructors
63
+
64
+ ### Constructor
65
+
66
+ ```ts
67
+ new SolidResource<T>(fetcher): SolidResource<T>;
68
+ ```
69
+
70
+ Defined in: [solid/primitives.ts:204](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L204)
71
+
72
+ Creates a new SolidResource from a fetcher function.
73
+
74
+ #### Parameters
75
+
76
+ | Parameter | Type | Description |
77
+ | ------ | ------ | ------ |
78
+ | `fetcher` | `ResourceFetcher`\<`true`, `T`, `unknown`\> | The async fetcher function. |
79
+
80
+ #### Returns
81
+
82
+ `SolidResource`\<`T`\>
83
+
84
+ ## Properties
85
+
86
+ | Property | Modifier | Type | Description | Defined in |
87
+ | ------ | ------ | ------ | ------ | ------ |
88
+ | <a id="get"></a> `get` | `readonly` | () => `T` \| `undefined` | Returns the current value (or undefined if not yet loaded). | [solid/primitives.ts:181](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L181) |
89
+ | <a id="latest"></a> `latest` | `readonly` | () => `T` \| `undefined` | Returns the latest successfully loaded value (or undefined). | [solid/primitives.ts:194](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L194) |
90
+ | <a id="refetch"></a> `refetch` | `readonly` | () => `void` | Triggers a refetch of the resource. | [solid/primitives.ts:198](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L198) |
91
+ | <a id="state"></a> `state` | `readonly` | () => `"unresolved"` \| `"pending"` \| `"errored"` \| `"ready"` \| `"refreshing"` | Returns the current resource state. | [solid/primitives.ts:185](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L185) |
@@ -0,0 +1,71 @@
1
+ [@ersbeth/picoflow](/api/index.md) / SolidState
2
+
3
+ # Class: SolidState\<T\>
4
+
5
+ Defined in: [solid/primitives.ts:58](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L58)
6
+
7
+ Solid-style state container wrapping SolidJS's createSignal, providing a writable reactive signal.
8
+
9
+ ## Remarks
10
+
11
+ SolidState is a thin wrapper around SolidJS's `createSignal` that provides a class-based
12
+ interface consistent with PicoFlow's API style. It's used internally by PicoFlow's Solid
13
+ integration but can also be used directly in Solid components.
14
+
15
+ Unlike PicoFlow's [FlowState](/api/classes/FlowState.md) which uses explicit tracking context, SolidState
16
+ relies on SolidJS's automatic dependency tracking within reactive contexts like
17
+ `createEffect` or component render functions.
18
+
19
+ ## Example
20
+
21
+ ```typescript
22
+ const count = new SolidState(0);
23
+
24
+ // In a Solid component
25
+ function Counter() {
26
+ return <div>{count.get()}</div>; // Automatically reactive
27
+ }
28
+
29
+ // Update the value
30
+ count.set(1);
31
+ count.set(prev => prev + 1);
32
+ ```
33
+
34
+ ## Type Parameters
35
+
36
+ | Type Parameter | Description |
37
+ | ------ | ------ |
38
+ | `T` | The value type. |
39
+
40
+ ## Implements
41
+
42
+ - [`SolidObservable`](/api/interfaces/SolidObservable.md)\<`T`\>
43
+
44
+ ## Constructors
45
+
46
+ ### Constructor
47
+
48
+ ```ts
49
+ new SolidState<T>(initialValue): SolidState<T>;
50
+ ```
51
+
52
+ Defined in: [solid/primitives.ts:72](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L72)
53
+
54
+ Creates a new SolidState with the given initial value.
55
+
56
+ #### Parameters
57
+
58
+ | Parameter | Type | Description |
59
+ | ------ | ------ | ------ |
60
+ | `initialValue` | `T` | The initial value. |
61
+
62
+ #### Returns
63
+
64
+ `SolidState`\<`T`\>
65
+
66
+ ## Properties
67
+
68
+ | Property | Modifier | Type | Description | Defined in |
69
+ | ------ | ------ | ------ | ------ | ------ |
70
+ | <a id="get"></a> `get` | `readonly` | () => `T` | Returns the current value. | [solid/primitives.ts:62](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L62) |
71
+ | <a id="set"></a> `set` | `readonly` | (`param`) => `void` | Sets the value or updates it using a getter function. | [solid/primitives.ts:66](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/solid/primitives.ts#L66) |
@@ -0,0 +1,33 @@
1
+ [@ersbeth/picoflow](/api/index.md) / TrackingContext
2
+
3
+ # Class: TrackingContext
4
+
5
+ Defined in: [basic/trackingContext.ts:34](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/basic/trackingContext.ts#L34)
6
+
7
+ Represents a tracking context used to register dependencies during reactive computations.
8
+
9
+ ## Remarks
10
+
11
+ TrackingContext is the core mechanism that enables automatic dependency tracking in PicoFlow's
12
+ reactive system. When you create an effect or derivation, PicoFlow automatically creates and
13
+ manages a TrackingContext instance for you. This context is passed as a parameter (typically
14
+ named `t`) to your computation functions.
15
+
16
+ You use the tracking context to explicitly mark which observables should be tracked as dependencies:
17
+ - Call `observable.get(t)` to read a value AND register it as a dependency
18
+ - Call `observable.pick()` to read a value WITHOUT registering it as a dependency
19
+ - Call `signal.watch(t)` to register a signal as a dependency without reading a value
20
+
21
+ End-users typically don't instantiate TrackingContext directly; instead, they receive it as
22
+ a parameter in effect and derivation callbacks.
23
+
24
+ ## Example
25
+
26
+ ```typescript
27
+ // TrackingContext passed as parameter 't'
28
+ effect((t) => {
29
+ const value = $state.get(t); // Tracked dependency
30
+ const snapshot = $other.pick(); // Not tracked
31
+ console.log(value, snapshot);
32
+ });
33
+ ```
@@ -0,0 +1,58 @@
1
+ [@ersbeth/picoflow](/api/index.md) / array
2
+
3
+ # Function: array()
4
+
5
+ ```ts
6
+ function array<T>(initial?): FlowArray<T>;
7
+ ```
8
+
9
+ Defined in: [creators.ts:393](https://gitlab.com/ersbeth-web/picoflow/-/blob/a6cd2e5702b60b87a8efe22e2fe7d2ce3b0ccca4/src/creators.ts#L393)
10
+
11
+ Creates a new reactive array with mutation methods and fine-grained action tracking.
12
+
13
+ ## Type Parameters
14
+
15
+ | Type Parameter | Description |
16
+ | ------ | ------ |
17
+ | `T` | The type of the array elements. |
18
+
19
+ ## Parameters
20
+
21
+ | Parameter | Type | Description |
22
+ | ------ | ------ | ------ |
23
+ | `initial?` | `T`[] | An optional array of initial values. |
24
+
25
+ ## Returns
26
+
27
+ [`FlowArray`](/api/classes/FlowArray.md)\<`T`\>
28
+
29
+ A new instance of [FlowArray](/api/classes/FlowArray.md).
30
+
31
+ ## Remarks
32
+
33
+ A reactive array provides array-like mutation methods (push, pop, shift, unshift, splice)
34
+ and tracks the last operation performed via `$lastAction`. This enables both whole-array
35
+ reactivity and fine-grained tracking of specific mutations.
36
+
37
+ The array automatically disposes disposable items when they are removed (if they implement
38
+ the FlowDisposable interface).
39
+
40
+ ## Example
41
+
42
+ ```typescript
43
+ const $items = array([1, 2, 3]);
44
+
45
+ // Track the whole array
46
+ effect((t) => {
47
+ console.log('Items:', $items.get(t));
48
+ });
49
+
50
+ // Track the last action
51
+ effect((t) => {
52
+ const action = $items.$lastAction.get(t);
53
+ console.log('Action:', action.type);
54
+ });
55
+
56
+ $items.push(4); // Logs action: "push"
57
+ $items.pop(); // Logs action: "pop"
58
+ ```