@ersbeth/picoflow 1.1.2 → 2.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 (383) hide show
  1. package/.vscode/settings.json +3 -3
  2. package/CHANGELOG.md +43 -0
  3. package/README.md +2 -18
  4. package/biome.json +45 -35
  5. package/dist/picoflow.js +856 -1530
  6. package/dist/types/api/base/flowDisposable.d.ts +41 -0
  7. package/dist/types/api/base/flowDisposable.d.ts.map +1 -0
  8. package/dist/types/api/base/flowObservable.d.ts +27 -0
  9. package/dist/types/api/base/flowObservable.d.ts.map +1 -0
  10. package/dist/types/api/base/flowSubscribable.d.ts +79 -0
  11. package/dist/types/api/base/flowSubscribable.d.ts.map +1 -0
  12. package/dist/types/api/base/flowTracker.d.ts +8 -0
  13. package/dist/types/api/base/flowTracker.d.ts.map +1 -0
  14. package/dist/types/api/base/index.d.ts +5 -0
  15. package/dist/types/api/base/index.d.ts.map +1 -0
  16. package/dist/types/api/index.d.ts +3 -0
  17. package/dist/types/api/index.d.ts.map +1 -0
  18. package/dist/types/api/nodes/async/flowConstantAsync.d.ts +31 -0
  19. package/dist/types/api/nodes/async/flowConstantAsync.d.ts.map +1 -0
  20. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts +37 -0
  21. package/dist/types/api/nodes/async/flowDerivationAsync.d.ts.map +1 -0
  22. package/dist/types/api/nodes/async/flowStateAsync.d.ts +41 -0
  23. package/dist/types/api/nodes/async/flowStateAsync.d.ts.map +1 -0
  24. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts +30 -0
  25. package/dist/types/api/nodes/async/flowWritableDerivationAsync.d.ts.map +1 -0
  26. package/dist/types/{flow → api}/nodes/async/index.d.ts +1 -2
  27. package/dist/types/api/nodes/async/index.d.ts.map +1 -0
  28. package/dist/types/api/nodes/collections/flowArray.d.ts +134 -0
  29. package/dist/types/api/nodes/collections/flowArray.d.ts.map +1 -0
  30. package/dist/types/api/nodes/collections/flowMap.d.ts +98 -0
  31. package/dist/types/api/nodes/collections/flowMap.d.ts.map +1 -0
  32. package/dist/types/api/nodes/collections/index.d.ts.map +1 -0
  33. package/dist/types/api/nodes/flowEffect.d.ts +28 -0
  34. package/dist/types/api/nodes/flowEffect.d.ts.map +1 -0
  35. package/dist/types/api/nodes/flowSignal.d.ts +25 -0
  36. package/dist/types/api/nodes/flowSignal.d.ts.map +1 -0
  37. package/dist/types/api/nodes/flowValue.d.ts +35 -0
  38. package/dist/types/api/nodes/flowValue.d.ts.map +1 -0
  39. package/dist/types/api/nodes/index.d.ts +8 -0
  40. package/dist/types/api/nodes/index.d.ts.map +1 -0
  41. package/dist/types/api/nodes/sync/flowConstant.d.ts +29 -0
  42. package/dist/types/api/nodes/sync/flowConstant.d.ts.map +1 -0
  43. package/dist/types/api/nodes/sync/flowDerivation.d.ts +36 -0
  44. package/dist/types/api/nodes/sync/flowDerivation.d.ts.map +1 -0
  45. package/dist/types/api/nodes/sync/flowState.d.ts +39 -0
  46. package/dist/types/api/nodes/sync/flowState.d.ts.map +1 -0
  47. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts +28 -0
  48. package/dist/types/api/nodes/sync/flowWritableDerivation.d.ts.map +1 -0
  49. package/dist/types/{flow → api}/nodes/sync/index.d.ts +1 -2
  50. package/dist/types/api/nodes/sync/index.d.ts.map +1 -0
  51. package/dist/types/api/nodes/utils.d.ts +22 -0
  52. package/dist/types/api/nodes/utils.d.ts.map +1 -0
  53. package/dist/types/base/disposable.d.ts +11 -0
  54. package/dist/types/base/disposable.d.ts.map +1 -0
  55. package/dist/types/base/executionStack.d.ts +14 -0
  56. package/dist/types/base/executionStack.d.ts.map +1 -0
  57. package/dist/types/base/index.d.ts +6 -0
  58. package/dist/types/base/index.d.ts.map +1 -0
  59. package/dist/types/base/node.d.ts +27 -0
  60. package/dist/types/base/node.d.ts.map +1 -0
  61. package/dist/types/base/observable.d.ts +37 -0
  62. package/dist/types/base/observable.d.ts.map +1 -0
  63. package/dist/types/base/observer.d.ts +25 -0
  64. package/dist/types/base/observer.d.ts.map +1 -0
  65. package/dist/types/converters/index.d.ts +2 -0
  66. package/dist/types/converters/index.d.ts.map +1 -0
  67. package/dist/types/converters/solid.d.ts +46 -0
  68. package/dist/types/converters/solid.d.ts.map +1 -0
  69. package/dist/types/index.d.ts +2 -63
  70. package/dist/types/index.d.ts.map +1 -1
  71. package/dist/types/nodes/arrayNode.d.ts +2 -0
  72. package/dist/types/nodes/arrayNode.d.ts.map +1 -0
  73. package/dist/types/nodes/effectNode.d.ts +2 -0
  74. package/dist/types/nodes/effectNode.d.ts.map +1 -0
  75. package/dist/types/nodes/index.d.ts +9 -0
  76. package/dist/types/nodes/index.d.ts.map +1 -0
  77. package/dist/types/nodes/mapNode.d.ts +2 -0
  78. package/dist/types/nodes/mapNode.d.ts.map +1 -0
  79. package/dist/types/nodes/signalNode.d.ts +2 -0
  80. package/dist/types/nodes/signalNode.d.ts.map +1 -0
  81. package/dist/types/nodes/valueAsyncNode.d.ts +2 -0
  82. package/dist/types/nodes/valueAsyncNode.d.ts.map +1 -0
  83. package/dist/types/nodes/valueNode.d.ts +2 -0
  84. package/dist/types/nodes/valueNode.d.ts.map +1 -0
  85. package/dist/types/nodes/valueSyncNode.d.ts +2 -0
  86. package/dist/types/nodes/valueSyncNode.d.ts.map +1 -0
  87. package/dist/types/schedulers/asyncResolver.d.ts +2 -0
  88. package/dist/types/schedulers/asyncResolver.d.ts.map +1 -0
  89. package/dist/types/schedulers/asyncScheduler.d.ts +2 -0
  90. package/dist/types/schedulers/asyncScheduler.d.ts.map +1 -0
  91. package/dist/types/schedulers/index.d.ts +5 -0
  92. package/dist/types/schedulers/index.d.ts.map +1 -0
  93. package/dist/types/schedulers/pendingError.d.ts +2 -0
  94. package/dist/types/schedulers/pendingError.d.ts.map +1 -0
  95. package/dist/types/schedulers/scheduler.d.ts +2 -0
  96. package/dist/types/schedulers/scheduler.d.ts.map +1 -0
  97. package/dist/types/schedulers/syncResolver.d.ts +2 -0
  98. package/dist/types/schedulers/syncResolver.d.ts.map +1 -0
  99. package/dist/types/schedulers/syncScheduler.d.ts +2 -0
  100. package/dist/types/schedulers/syncScheduler.d.ts.map +1 -0
  101. package/docs/.vitepress/config.mts +128 -93
  102. package/docs/api/functions/array.md +14 -37
  103. package/docs/api/functions/constant.md +13 -25
  104. package/docs/api/functions/constantAsync.md +69 -0
  105. package/docs/api/functions/derivation.md +14 -33
  106. package/docs/api/functions/derivationAsync.md +34 -0
  107. package/docs/api/functions/from.md +62 -153
  108. package/docs/api/functions/isDisposable.md +8 -30
  109. package/docs/api/functions/map.md +15 -36
  110. package/docs/api/functions/signal.md +8 -23
  111. package/docs/api/functions/state.md +43 -23
  112. package/docs/api/functions/stateAsync.md +69 -0
  113. package/docs/api/functions/subscribe.md +40 -0
  114. package/docs/api/functions/writableDerivation.md +33 -0
  115. package/docs/api/functions/writableDerivationAsync.md +34 -0
  116. package/docs/api/index.md +45 -102
  117. package/docs/api/interfaces/FlowArray.md +439 -0
  118. package/docs/api/interfaces/FlowConstant.md +220 -0
  119. package/docs/api/interfaces/FlowConstantAsync.md +221 -0
  120. package/docs/api/interfaces/FlowDerivation.md +241 -0
  121. package/docs/api/interfaces/FlowDerivationAsync.md +242 -0
  122. package/docs/api/interfaces/FlowDisposable.md +32 -38
  123. package/docs/api/interfaces/FlowEffect.md +64 -0
  124. package/docs/api/interfaces/FlowMap.md +374 -0
  125. package/docs/api/interfaces/FlowObservable.md +155 -0
  126. package/docs/api/interfaces/FlowSignal.md +156 -0
  127. package/docs/api/interfaces/FlowState.md +269 -0
  128. package/docs/api/interfaces/FlowStateAsync.md +268 -0
  129. package/docs/api/interfaces/FlowSubscribable.md +55 -0
  130. package/docs/api/interfaces/FlowTracker.md +61 -0
  131. package/docs/api/interfaces/FlowValue.md +222 -0
  132. package/docs/api/interfaces/FlowWritableDerivation.md +292 -0
  133. package/docs/api/interfaces/FlowWritableDerivationAsync.md +293 -0
  134. package/docs/api/type-aliases/DerivationFunction.md +28 -0
  135. package/docs/api/type-aliases/DerivationFunctionAsync.md +28 -0
  136. package/docs/api/type-aliases/FlowArrayAction.md +19 -8
  137. package/docs/api/type-aliases/FlowDataTracker.md +33 -0
  138. package/docs/api/type-aliases/FlowMapAction.md +48 -0
  139. package/docs/api/type-aliases/FlowOnDataListener.md +33 -0
  140. package/docs/api/type-aliases/FlowOnErrorListener.md +27 -0
  141. package/docs/api/type-aliases/FlowOnPendingListener.md +21 -0
  142. package/docs/api/type-aliases/FlowReadonly.md +22 -0
  143. package/docs/api/type-aliases/InitFunction.md +21 -0
  144. package/docs/api/type-aliases/InitFunctionAsync.md +21 -0
  145. package/docs/api/type-aliases/NotPromise.md +6 -3
  146. package/docs/api/type-aliases/UpdateFunction.md +27 -0
  147. package/docs/api/type-aliases/UpdateFunctionAsync.md +27 -0
  148. package/docs/api/typedoc-sidebar.json +1 -81
  149. package/docs/examples/examples.md +0 -2
  150. package/docs/guide/advanced/architecture.md +1234 -0
  151. package/docs/guide/advanced/migration-v2.md +204 -0
  152. package/docs/guide/advanced/solidjs.md +2 -88
  153. package/docs/guide/introduction/concepts.md +4 -3
  154. package/docs/guide/introduction/conventions.md +2 -33
  155. package/docs/guide/introduction/getting-started.md +28 -23
  156. package/docs/guide/introduction/lifecycle.md +16 -19
  157. package/docs/guide/primitives/array.md +102 -216
  158. package/docs/guide/primitives/constant.md +39 -212
  159. package/docs/guide/primitives/derivations.md +55 -122
  160. package/docs/guide/primitives/effects.md +155 -241
  161. package/docs/guide/primitives/map.md +64 -186
  162. package/docs/guide/primitives/overview.md +45 -128
  163. package/docs/guide/primitives/signal.md +51 -88
  164. package/docs/guide/primitives/state.md +34 -130
  165. package/package.json +56 -60
  166. package/src/api/base/flowDisposable.ts +44 -0
  167. package/src/api/base/flowObservable.ts +28 -0
  168. package/src/api/base/flowSubscribable.ts +87 -0
  169. package/src/api/base/flowTracker.ts +7 -0
  170. package/src/api/base/index.ts +4 -0
  171. package/src/{flow → api}/index.ts +0 -1
  172. package/src/api/nodes/async/flowConstantAsync.ts +36 -0
  173. package/src/api/nodes/async/flowDerivationAsync.ts +42 -0
  174. package/src/api/nodes/async/flowStateAsync.ts +47 -0
  175. package/src/api/nodes/async/flowWritableDerivationAsync.ts +33 -0
  176. package/src/{flow → api}/nodes/async/index.ts +1 -2
  177. package/src/api/nodes/collections/flowArray.ts +155 -0
  178. package/src/api/nodes/collections/flowMap.ts +115 -0
  179. package/src/api/nodes/flowEffect.ts +42 -0
  180. package/src/api/nodes/flowSignal.ts +28 -0
  181. package/src/api/nodes/flowValue.ts +36 -0
  182. package/src/api/nodes/index.ts +7 -0
  183. package/src/api/nodes/sync/flowConstant.ts +33 -0
  184. package/src/api/nodes/sync/flowDerivation.ts +41 -0
  185. package/src/api/nodes/sync/flowState.ts +45 -0
  186. package/src/api/nodes/sync/flowWritableDerivation.ts +31 -0
  187. package/src/{flow → api}/nodes/sync/index.ts +1 -2
  188. package/src/api/nodes/utils.ts +22 -0
  189. package/src/base/disposable.ts +18 -0
  190. package/src/base/executionStack.ts +42 -0
  191. package/src/base/index.ts +5 -0
  192. package/src/base/node.ts +98 -0
  193. package/src/base/observable.ts +87 -0
  194. package/src/base/observer.ts +51 -0
  195. package/src/converters/index.ts +1 -0
  196. package/src/converters/solid.ts +109 -0
  197. package/src/index.ts +2 -64
  198. package/src/nodes/arrayNode.ts +172 -0
  199. package/src/nodes/effectNode.ts +59 -0
  200. package/src/nodes/index.ts +8 -0
  201. package/src/nodes/mapNode.ts +127 -0
  202. package/src/nodes/signalNode.ts +21 -0
  203. package/src/nodes/valueAsyncNode.ts +88 -0
  204. package/src/nodes/valueNode.ts +144 -0
  205. package/src/nodes/valueSyncNode.ts +128 -0
  206. package/src/schedulers/asyncResolver.ts +78 -0
  207. package/src/schedulers/asyncScheduler.ts +66 -0
  208. package/src/schedulers/index.ts +4 -0
  209. package/src/schedulers/pendingError.ts +13 -0
  210. package/src/schedulers/scheduler.ts +9 -0
  211. package/src/schedulers/syncResolver.ts +69 -0
  212. package/src/schedulers/syncScheduler.ts +55 -0
  213. package/test/base/pendingError.test.ts +67 -0
  214. package/test/converters/solid.derivation.browser.test.tsx +69 -0
  215. package/test/converters/solid.node.test.ts +654 -0
  216. package/test/converters/solid.state.browser.test.tsx +1592 -0
  217. package/test/reactivity/flowSignal.test.ts +226 -0
  218. package/test/reactivity/nodes/async/asyncScheduler/asyncResolver.test.ts +593 -0
  219. package/test/reactivity/nodes/async/asyncScheduler/asyncScheduler.test.ts +317 -0
  220. package/test/reactivity/nodes/async/flowConstantAsync.test.ts +652 -0
  221. package/test/reactivity/nodes/async/flowDerivation.test.ts +898 -0
  222. package/test/reactivity/nodes/async/flowDerivationAsync.test.ts +1716 -0
  223. package/test/reactivity/nodes/async/flowStateAsync.test.ts +708 -0
  224. package/test/reactivity/nodes/async/flowWritableDerivationAsync.test.ts +614 -0
  225. package/test/reactivity/nodes/collections/flowArray.asyncStates.test.ts +1289 -0
  226. package/test/reactivity/nodes/collections/flowArray.scalars.test.ts +961 -0
  227. package/test/reactivity/nodes/collections/flowArray.states.test.ts +1035 -0
  228. package/test/reactivity/nodes/collections/flowMap.asyncStates.test.ts +960 -0
  229. package/test/reactivity/nodes/collections/flowMap.scalars.test.ts +775 -0
  230. package/test/reactivity/nodes/collections/flowMap.states.test.ts +958 -0
  231. package/test/reactivity/nodes/sync/flowConstant.test.ts +377 -0
  232. package/test/reactivity/nodes/sync/flowDerivation.test.ts +896 -0
  233. package/test/reactivity/nodes/sync/flowState.test.ts +341 -0
  234. package/test/reactivity/nodes/sync/flowWritableDerivation.test.ts +603 -0
  235. package/test/vitest.d.ts +10 -0
  236. package/tsconfig.json +31 -20
  237. package/typedoc.json +35 -35
  238. package/vite.config.ts +25 -23
  239. package/vitest.browser.config.ts +21 -0
  240. package/vitest.config.ts +12 -12
  241. package/.cursor/plans/unifier-flowresource-avec-flowderivation-c9506e24.plan.md +0 -372
  242. package/.cursor/plans/update-js-e795d61b.plan.md +0 -567
  243. package/dist/types/flow/base/flowDisposable.d.ts +0 -67
  244. package/dist/types/flow/base/flowDisposable.d.ts.map +0 -1
  245. package/dist/types/flow/base/flowEffect.d.ts +0 -127
  246. package/dist/types/flow/base/flowEffect.d.ts.map +0 -1
  247. package/dist/types/flow/base/flowGraph.d.ts +0 -97
  248. package/dist/types/flow/base/flowGraph.d.ts.map +0 -1
  249. package/dist/types/flow/base/flowSignal.d.ts +0 -134
  250. package/dist/types/flow/base/flowSignal.d.ts.map +0 -1
  251. package/dist/types/flow/base/flowTracker.d.ts +0 -15
  252. package/dist/types/flow/base/flowTracker.d.ts.map +0 -1
  253. package/dist/types/flow/base/index.d.ts +0 -7
  254. package/dist/types/flow/base/index.d.ts.map +0 -1
  255. package/dist/types/flow/base/utils.d.ts +0 -20
  256. package/dist/types/flow/base/utils.d.ts.map +0 -1
  257. package/dist/types/flow/collections/flowArray.d.ts +0 -148
  258. package/dist/types/flow/collections/flowArray.d.ts.map +0 -1
  259. package/dist/types/flow/collections/flowMap.d.ts +0 -224
  260. package/dist/types/flow/collections/flowMap.d.ts.map +0 -1
  261. package/dist/types/flow/collections/index.d.ts.map +0 -1
  262. package/dist/types/flow/index.d.ts +0 -4
  263. package/dist/types/flow/index.d.ts.map +0 -1
  264. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts +0 -137
  265. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts.map +0 -1
  266. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts +0 -137
  267. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts.map +0 -1
  268. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts +0 -343
  269. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts.map +0 -1
  270. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts +0 -81
  271. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts.map +0 -1
  272. package/dist/types/flow/nodes/async/flowStateAsync.d.ts +0 -111
  273. package/dist/types/flow/nodes/async/flowStateAsync.d.ts.map +0 -1
  274. package/dist/types/flow/nodes/async/index.d.ts.map +0 -1
  275. package/dist/types/flow/nodes/index.d.ts +0 -3
  276. package/dist/types/flow/nodes/index.d.ts.map +0 -1
  277. package/dist/types/flow/nodes/sync/flowConstant.d.ts +0 -108
  278. package/dist/types/flow/nodes/sync/flowConstant.d.ts.map +0 -1
  279. package/dist/types/flow/nodes/sync/flowDerivation.d.ts +0 -100
  280. package/dist/types/flow/nodes/sync/flowDerivation.d.ts.map +0 -1
  281. package/dist/types/flow/nodes/sync/flowNode.d.ts +0 -314
  282. package/dist/types/flow/nodes/sync/flowNode.d.ts.map +0 -1
  283. package/dist/types/flow/nodes/sync/flowReadonly.d.ts +0 -57
  284. package/dist/types/flow/nodes/sync/flowReadonly.d.ts.map +0 -1
  285. package/dist/types/flow/nodes/sync/flowState.d.ts +0 -96
  286. package/dist/types/flow/nodes/sync/flowState.d.ts.map +0 -1
  287. package/dist/types/flow/nodes/sync/index.d.ts.map +0 -1
  288. package/dist/types/solid/converters.d.ts +0 -57
  289. package/dist/types/solid/converters.d.ts.map +0 -1
  290. package/dist/types/solid/index.d.ts +0 -3
  291. package/dist/types/solid/index.d.ts.map +0 -1
  292. package/dist/types/solid/primitives.d.ts +0 -181
  293. package/dist/types/solid/primitives.d.ts.map +0 -1
  294. package/docs/api/classes/FlowArray.md +0 -489
  295. package/docs/api/classes/FlowConstant.md +0 -350
  296. package/docs/api/classes/FlowDerivation.md +0 -334
  297. package/docs/api/classes/FlowEffect.md +0 -100
  298. package/docs/api/classes/FlowMap.md +0 -512
  299. package/docs/api/classes/FlowObservable.md +0 -306
  300. package/docs/api/classes/FlowResource.md +0 -380
  301. package/docs/api/classes/FlowResourceAsync.md +0 -362
  302. package/docs/api/classes/FlowSignal.md +0 -160
  303. package/docs/api/classes/FlowState.md +0 -368
  304. package/docs/api/classes/FlowStream.md +0 -367
  305. package/docs/api/classes/FlowStreamAsync.md +0 -364
  306. package/docs/api/classes/SolidDerivation.md +0 -75
  307. package/docs/api/classes/SolidResource.md +0 -91
  308. package/docs/api/classes/SolidState.md +0 -71
  309. package/docs/api/classes/TrackingContext.md +0 -33
  310. package/docs/api/functions/effect.md +0 -49
  311. package/docs/api/functions/resource.md +0 -52
  312. package/docs/api/functions/resourceAsync.md +0 -50
  313. package/docs/api/functions/stream.md +0 -53
  314. package/docs/api/functions/streamAsync.md +0 -50
  315. package/docs/api/interfaces/SolidObservable.md +0 -19
  316. package/docs/api/type-aliases/FlowStreamDisposer.md +0 -15
  317. package/docs/api/type-aliases/FlowStreamSetter.md +0 -27
  318. package/docs/api/type-aliases/FlowStreamUpdater.md +0 -32
  319. package/docs/api/type-aliases/SolidGetter.md +0 -17
  320. package/docs/guide/primitives/resources.md +0 -858
  321. package/docs/guide/primitives/streams.md +0 -931
  322. package/src/flow/base/flowDisposable.ts +0 -71
  323. package/src/flow/base/flowEffect.ts +0 -171
  324. package/src/flow/base/flowGraph.ts +0 -288
  325. package/src/flow/base/flowSignal.ts +0 -207
  326. package/src/flow/base/flowTracker.ts +0 -17
  327. package/src/flow/base/index.ts +0 -6
  328. package/src/flow/base/utils.ts +0 -19
  329. package/src/flow/collections/flowArray.ts +0 -409
  330. package/src/flow/collections/flowMap.ts +0 -398
  331. package/src/flow/nodes/async/flowConstantAsync.ts +0 -142
  332. package/src/flow/nodes/async/flowDerivationAsync.ts +0 -143
  333. package/src/flow/nodes/async/flowNodeAsync.ts +0 -474
  334. package/src/flow/nodes/async/flowReadonlyAsync.ts +0 -81
  335. package/src/flow/nodes/async/flowStateAsync.ts +0 -116
  336. package/src/flow/nodes/await/advanced/index.ts +0 -5
  337. package/src/flow/nodes/await/advanced/resource.ts +0 -134
  338. package/src/flow/nodes/await/advanced/resourceAsync.ts +0 -109
  339. package/src/flow/nodes/await/advanced/stream.ts +0 -188
  340. package/src/flow/nodes/await/advanced/streamAsync.ts +0 -176
  341. package/src/flow/nodes/await/flowConstantAwait.ts +0 -154
  342. package/src/flow/nodes/await/flowDerivationAwait.ts +0 -154
  343. package/src/flow/nodes/await/flowNodeAwait.ts +0 -508
  344. package/src/flow/nodes/await/flowReadonlyAwait.ts +0 -89
  345. package/src/flow/nodes/await/flowStateAwait.ts +0 -130
  346. package/src/flow/nodes/await/index.ts +0 -5
  347. package/src/flow/nodes/index.ts +0 -3
  348. package/src/flow/nodes/sync/flowConstant.ts +0 -111
  349. package/src/flow/nodes/sync/flowDerivation.ts +0 -105
  350. package/src/flow/nodes/sync/flowNode.ts +0 -439
  351. package/src/flow/nodes/sync/flowReadonly.ts +0 -57
  352. package/src/flow/nodes/sync/flowState.ts +0 -101
  353. package/src/solid/converters.ts +0 -148
  354. package/src/solid/index.ts +0 -2
  355. package/src/solid/primitives.ts +0 -215
  356. package/test/base/flowEffect.test.ts +0 -108
  357. package/test/base/flowGraph.test.ts +0 -485
  358. package/test/base/flowSignal.test.ts +0 -372
  359. package/test/collections/flowArray.asyncStates.test.ts +0 -1553
  360. package/test/collections/flowArray.scalars.test.ts +0 -1129
  361. package/test/collections/flowArray.states.test.ts +0 -1365
  362. package/test/collections/flowMap.asyncStates.test.ts +0 -1105
  363. package/test/collections/flowMap.scalars.test.ts +0 -877
  364. package/test/collections/flowMap.states.test.ts +0 -1097
  365. package/test/nodes/async/flowConstantAsync.test.ts +0 -860
  366. package/test/nodes/async/flowDerivationAsync.test.ts +0 -1517
  367. package/test/nodes/async/flowStateAsync.test.ts +0 -1387
  368. package/test/nodes/await/advanced/resource.test.ts +0 -129
  369. package/test/nodes/await/advanced/resourceAsync.test.ts +0 -108
  370. package/test/nodes/await/advanced/stream.test.ts +0 -198
  371. package/test/nodes/await/advanced/streamAsync.test.ts +0 -196
  372. package/test/nodes/await/flowConstantAwait.test.ts +0 -643
  373. package/test/nodes/await/flowDerivationAwait.test.ts +0 -1583
  374. package/test/nodes/await/flowStateAwait.test.ts +0 -999
  375. package/test/nodes/mixed/derivation.test.ts +0 -1527
  376. package/test/nodes/sync/flowConstant.test.ts +0 -620
  377. package/test/nodes/sync/flowDerivation.test.ts +0 -1373
  378. package/test/nodes/sync/flowState.test.ts +0 -945
  379. package/test/solid/converters.test.ts +0 -721
  380. package/test/solid/primitives.test.ts +0 -1031
  381. /package/dist/types/{flow → api/nodes}/collections/index.d.ts +0 -0
  382. /package/docs/guide/advanced/{upgrading.md → migration-v1.md} +0 -0
  383. /package/src/{flow → api/nodes}/collections/index.ts +0 -0
@@ -2,15 +2,6 @@
2
2
 
3
3
  PicoFlow provides reactive arrays with **fine-grained tracking**. Instead of reacting to the entire array changing, you can react to specific operations like pushing, popping, or splicing individual items.
4
4
 
5
- Imagine you have a list of 1000 todos. In a naive reactive system, every time you add, remove, or update a single todo, the entire list re-renders. **Inefficient!** With PicoFlow's reactive arrays, you can track specific operations and only update what changed.
6
-
7
- ### Key Characteristics
8
-
9
- - **Fine-grained reactivity**: Track individual operations (push, pop, splice, etc.) separately
10
- - **Multiple tracking levels**: Track the whole array or specific operations
11
- - **Native Array**: Uses JavaScript's native `Array<T>` internally
12
- - **Operation-specific signal**: `$lastAction` for granular tracking of all operations
13
- - **Disposable**: Can be disposed to clean up resources
14
5
 
15
6
  ## When to Use Arrays
16
7
 
@@ -18,16 +9,12 @@ Use arrays when you need to:
18
9
 
19
10
  - ✅ Track large collections with fine-grained updates
20
11
  - ✅ React to specific operations (additions, removals, updates) separately
21
- - ✅ Manage ordered collections where individual item operations matter
22
12
  - ✅ Optimize performance by avoiding full array re-processing
23
- - ✅ Animate or handle UI updates for specific changes
24
13
 
25
14
  Don't use arrays when:
26
15
 
27
- - ❌ You have a small, simple list (use `state` instead)
28
16
  - ❌ You don't need fine-grained tracking (use `state` with an array)
29
17
  - ❌ You need key-value operations (use `map` instead)
30
- - ❌ The collection is rarely modified (regular state might be simpler)
31
18
 
32
19
  ## Creating Arrays
33
20
 
@@ -52,7 +39,7 @@ Arrays provide multiple ways to track changes and perform operations.
52
39
 
53
40
  ### Array Operations
54
41
 
55
- Arrays provide several operations: `set()`, `setItem()`, `push()`, `pop()`, `unshift()`, `shift()`, `splice()`, and `clear()`.
42
+ Arrays provide several operations: `set()`, `update()`, `push()`, `pop()`, `unshift()`, `shift()`, `splice()`, and `clear()`.
56
43
 
57
44
  ```typescript
58
45
  const $list = array<number>([])
@@ -61,7 +48,7 @@ const $list = array<number>([])
61
48
  $list.set([1, 2, 3])
62
49
 
63
50
  // Replace item at index
64
- $list.setItem(0, 10)
51
+ $list.update(0, 10)
65
52
 
66
53
  // Add to end
67
54
  $list.push(4)
@@ -82,9 +69,9 @@ $list.splice(1, 1, 99) // Remove 1 item at index 1, add 99
82
69
  $list.clear()
83
70
 
84
71
  // Read (reactive)
85
- effect((t) => {
86
- const items = $list.get(t)
72
+ $list.subscribe((items) => {
87
73
  // Track entire array
74
+ console.log(items)
88
75
  })
89
76
 
90
77
  // Read (non-reactive)
@@ -92,21 +79,18 @@ const snapshot = $list.pick()
92
79
  ```
93
80
 
94
81
  **Important**:
95
- - `setItem(index, item)` throws an error if the index is out of bounds
82
+ - `update(index, item)` throws an error if the index is out of bounds
96
83
  - `push(item)` only accepts a single item
97
84
  - `splice(start, deleteCount, ...items)` accepts multiple items to add
98
85
 
99
- ### Whole Array Tracking with `.get(t)`
86
+ ### Whole Array Tracking
100
87
 
101
88
  Track when the entire array changes (any operation):
102
89
 
103
90
  ```typescript
104
- import { array, effect } from '@ersbeth/picoflow'
105
-
106
91
  const $items = array([1, 2, 3])
107
92
 
108
- effect((t) => {
109
- const items = $items.get(t) // Track all changes
93
+ $items.subscribe((items) => {
110
94
  console.log('Array changed:', items)
111
95
  })
112
96
 
@@ -117,33 +101,34 @@ $items.splice(1, 1) // Logs: "Array changed: [1,3]"
117
101
 
118
102
  Use `.get(t)` when you need the entire array's current state. It returns a copy of the array.
119
103
 
120
- ### Fine-Grained: Track Operations
104
+ ### Fine-Grained Tracking
121
105
 
122
106
  Track specific operations with `$lastAction`:
123
107
 
124
108
  ```typescript
125
109
  const $items = array<number>([])
126
110
 
127
- effect((t) => {
128
- const action = $items.$lastAction.get(t)
129
- if (!action) return
130
-
131
- switch (action.type) {
132
- case 'push':
133
- console.log('Pushed:', action.item)
134
- break
135
- case 'pop':
136
- console.log('Popped')
137
- break
138
- case 'splice':
139
- console.log('Splice at', action.start, ':', action.deleteCount, 'deleted,', action.items.length, 'added')
140
- break
141
- case 'setItem':
142
- console.log('Set item at', action.index, 'to', action.item)
143
- break
144
- // ... other operations
111
+ $items.$lastAction.subscribe(
112
+ (action) => {
113
+ if (!action) return
114
+
115
+ switch (action.type) {
116
+ case 'push':
117
+ console.log('Pushed:', action.item)
118
+ break
119
+ case 'pop':
120
+ console.log('Popped')
121
+ break
122
+ case 'splice':
123
+ console.log('Splice at', action.start, ':', action.deleteCount, 'deleted,', action.items.length, 'added')
124
+ break
125
+ case 'update':
126
+ console.log('Set item at', action.index, 'to', action.item)
127
+ break
128
+ // ... other operations
129
+ }
145
130
  }
146
- })
131
+ )
147
132
 
148
133
  $items.push(1) // Logs: "Pushed: 1"
149
134
  $items.push(2) // Logs: "Pushed: 2"
@@ -151,190 +136,121 @@ $items.pop() // Logs: "Popped"
151
136
  $items.splice(0, 1) // Logs: "Splice at 0: 1 deleted, 0 added"
152
137
  ```
153
138
 
154
- ## Array Action Types
155
-
156
- The `$lastAction` signal contains information about the last operation:
157
-
158
- ```typescript
159
- type FlowArrayAction<T> =
160
- | { type: 'set'; items: T[] }
161
- | { type: 'setItem'; index: number; item: T }
162
- | { type: 'push'; item: T }
163
- | { type: 'pop' }
164
- | { type: 'shift' }
165
- | { type: 'unshift'; item: T }
166
- | { type: 'splice'; start: number; deleteCount: number; items: T[] }
167
- | { type: 'clear' }
168
- ```
169
-
170
139
  ## Lifecycle
171
140
 
172
- When you create an effect that tracks an array:
141
+ When you create a subscription that tracks an array:
173
142
 
174
- 1. **Registration**: The array registers the effect as a watcher
143
+ 1. **Registration**: The array registers the subscription as a watcher
175
144
  2. **Operation**: When you call `push()`, `pop()`, `splice()`, etc., the array updates internally
176
145
  3. **Signal Update**: The `$lastAction` signal is updated with the operation details
177
- 4. **Notification**: All watching effects are scheduled to run
178
- 5. **Re-execution**: Each watching effect re-executes its function
146
+ 4. **Notification**: All watching subscriptions are scheduled to run
147
+ 5. **Re-execution**: Each watching subscription re-executes its function
179
148
 
180
149
  ```mermaid
181
150
  sequenceDiagram
182
151
  participant User
183
152
  participant Array as $todos (Array)
184
153
  participant Signal as $lastAction
185
- participant Effect
154
+ participant Subscription
186
155
 
187
- Note over User,Effect: 1. Setup Phase
188
- User->>Effect: Create effect
189
- activate Effect
190
- Effect->>Array: get(t)
191
- Note over Array: Register Effect as watcher
192
- Effect->>Signal: get(t)
193
- Note over Signal: Register Effect as watcher
194
- Effect->>Effect: Execute function
195
- Note over Effect: Initial render
196
- deactivate Effect
156
+ Note over User,Subscription: 1. Setup Phase
157
+ User->>Subscription: Create subscription
158
+ activate Subscription
159
+ Subscription->>Array: get(t)
160
+ Note over Array: Register Subscription as watcher
161
+ Subscription->>Signal: get(t)
162
+ Note over Signal: Register Subscription as watcher
163
+ Subscription->>Subscription: Execute function
164
+ Note over Subscription: Initial render
165
+ deactivate Subscription
197
166
 
198
- Note over User,Effect: 2. Operation Phase
167
+ Note over User,Subscription: 2. Operation Phase
199
168
  User->>Array: push(todo)
200
169
  activate Array
201
170
  Note over Array: Update internal array
202
171
  Array->>Signal: set({ type: 'push', item: todo })
203
172
  activate Signal
204
173
  Note over Signal: Notify watchers
205
- Signal->>Effect: Schedule execution
174
+ Signal->>Subscription: Schedule execution
206
175
  deactivate Signal
207
176
  Array->>Array: Notify whole array watchers
208
- Array->>Effect: Schedule execution
177
+ Array->>Subscription: Schedule execution
209
178
  deactivate Array
210
179
 
211
- activate Effect
212
- Note over Effect: Re-execute function
213
- Effect->>Signal: get(t)
214
- Signal-->>Effect: { type: 'push', item: todo }
215
- Effect->>Effect: Handle new todo
216
- Note over Effect: Update UI
217
- deactivate Effect
180
+ activate Subscription
181
+ Note over Subscription: Re-execute function
182
+ Subscription->>Signal: get(t)
183
+ Signal-->>Subscription: { type: 'push', item: todo }
184
+ Subscription->>Subscription: Handle new todo
185
+ Note over Subscription: Update UI
186
+ deactivate Subscription
218
187
  ```
219
188
 
220
189
  ## Best Practices
221
190
 
222
- ### Choose the Right Granularity
223
-
224
- ```typescript
225
- // ✅ Use fine-grained for large arrays
226
- const $todos = array<Todo>([...1000 todos...])
227
- effect((t) => {
228
- const action = $todos.$lastAction.get(t)
229
- if (action) {
230
- // Handle specific change
231
- }
232
- })
233
-
234
- // ✅ Use coarse-grained for small arrays
235
- const $settings = state(['dark', 'en', 'large'])
236
- effect((t) => {
237
- const settings = $settings.get(t)
238
- // Re-apply all settings (cheap for 3 items)
239
- })
240
- ```
241
-
242
- ### Combine for Best Results
243
-
244
- ```typescript
245
- // Fine-grained for UI updates
246
- effect((t) => {
247
- const action = $items.$lastAction.get(t)
248
- if (action) {
249
- updateUIIncremental(action)
250
- }
251
- })
252
-
253
- // Coarse-grained for totals
254
- const $total = derivation((t) => {
255
- return $items.get(t).reduce((sum, item) => sum + item.value, 0)
256
- })
257
- ```
258
-
259
191
  ### Handle All Action Types
260
192
 
261
193
  ```typescript
262
- effect((t) => {
263
- const action = $items.$lastAction.get(t)
264
- if (!action) return
265
-
266
- switch (action.type) {
267
- case 'push':
268
- // Handle push
269
- break
270
- case 'pop':
271
- // Handle pop
272
- break
273
- case 'splice':
274
- // Handle splice
275
- break
276
- case 'setItem':
277
- // Handle setItem
278
- break
279
- case 'clear':
280
- // Handle clear
281
- break
282
- // Don't forget any cases!
194
+ subscribe(
195
+ (t) => $items.$lastAction.get(t),
196
+ (action) => {
197
+ if (!action) return
198
+
199
+ switch (action.type) {
200
+ case 'push':
201
+ // Handle push
202
+ break
203
+ case 'pop':
204
+ // Handle pop
205
+ break
206
+ case 'splice':
207
+ // Handle splice
208
+ break
209
+ case 'update':
210
+ // Handle update
211
+ break
212
+ case 'clear':
213
+ // Handle clear
214
+ break
215
+ case 'unshift':
216
+ // Handle unshift
217
+ break
218
+ case 'shift':
219
+ // Handle shift
220
+ break
221
+ case 'set':
222
+ // Handle set (replace entire array)
223
+ break
224
+ }
283
225
  }
284
- })
226
+ )
285
227
  ```
286
228
 
287
229
  ### Dispose Items Properly
288
230
 
289
231
  ```typescript
290
232
  // When removing disposable items
291
- effect((t) => {
292
- const action = $resources.$lastAction.get(t)
293
- if (action && action.type === 'splice') {
294
- // Dispose removed items (they're already disposed by the array)
295
- // But you might want to do additional cleanup
233
+ subscribe(
234
+ (t) => $resources.$lastAction.get(t),
235
+ (action) => {
236
+ if (action && action.type === 'splice') {
237
+ // Dispose removed items
238
+ }
296
239
  }
297
- })
240
+ )
298
241
  ```
299
242
 
300
- Arrays automatically dispose disposable items when they are removed, but you can add additional cleanup logic if needed.
301
-
302
243
  ## Common Pitfalls
303
244
 
304
- ### Forgetting to Handle Nulls
305
-
306
- **Problem**: The `$lastAction` signal can be `null` initially or after certain operations.
307
-
308
- ```typescript
309
- // ❌ Can be null initially
310
- effect((t) => {
311
- const action = $items.$lastAction.get(t)
312
- console.log(action.type) // Error if null!
313
- })
314
- ```
315
-
316
- **Solution**: Always check for null:
317
-
318
- ```typescript
319
- // ✅ Check for null
320
- effect((t) => {
321
- const action = $items.$lastAction.get(t)
322
- if (action) {
323
- console.log(action.type)
324
- }
325
- })
326
- ```
327
-
328
245
  ### Using Wrong Tracking
329
246
 
330
247
  **Problem**: Tracking the entire array when you only need specific operations.
331
248
 
332
249
  ```typescript
333
250
  // ❌ Tracks entire array when you only need additions
334
- effect((t) => {
335
- const items = $items.get(t) // Runs on ALL changes
251
+ $items.subscribe((items) => {
336
252
  const lastItem = items[items.length - 1]
337
- animateNewItem(lastItem)
253
+ animateNewItem(lastItem) // Runs on ALL changes
338
254
  })
339
255
  ```
340
256
 
@@ -342,12 +258,14 @@ effect((t) => {
342
258
 
343
259
  ```typescript
344
260
  // ✅ Track only pushes
345
- effect((t) => {
346
- const action = $items.$lastAction.get(t)
347
- if (action && action.type === 'push') {
348
- animateNewItem(action.item)
261
+ subscribe(
262
+ (t) => $items.$lastAction.get(t),
263
+ (action) => {
264
+ if (action && action.type === 'push') {
265
+ animateNewItem(action.item)
266
+ }
349
267
  }
350
- })
268
+ )
351
269
  ```
352
270
 
353
271
  ### Mutating Retrieved Arrays
@@ -365,36 +283,4 @@ items.push(newItem) // Doesn't update reactive array!
365
283
  ```typescript
366
284
  // ✅ Use reactive methods
367
285
  $items.push(newItem)
368
- ```
369
-
370
- ### Using Wrong Action Properties
371
-
372
- **Problem**: Using incorrect property names from action objects.
373
-
374
- ```typescript
375
- // ❌ Wrong property names
376
- effect((t) => {
377
- const action = $items.$lastAction.get(t)
378
- if (action && action.type === 'push') {
379
- console.log(action.value) // Error! Should be action.item
380
- }
381
- if (action && action.type === 'splice') {
382
- console.log(action.index) // Error! Should be action.start
383
- }
384
- })
385
- ```
386
-
387
- **Solution**: Use correct property names:
388
-
389
- ```typescript
390
- // ✅ Correct property names
391
- effect((t) => {
392
- const action = $items.$lastAction.get(t)
393
- if (action && action.type === 'push') {
394
- console.log(action.item) // Correct
395
- }
396
- if (action && action.type === 'splice') {
397
- console.log(action.start) // Correct
398
- }
399
- })
400
- ```
286
+ ```