@ersbeth/picoflow 0.2.3 → 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 +557 -1099
  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 -20
  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
package/docs/index.md ADDED
@@ -0,0 +1,47 @@
1
+ ---
2
+ layout: home
3
+
4
+ hero:
5
+ name: PicoFlow
6
+ text: Lightweight Reactive Dataflow
7
+ tagline: Fine-grained reactive primitives for TypeScript with explicit dependency tracking
8
+ image:
9
+ src: /logo.svg
10
+ alt: PicoFlow
11
+ actions:
12
+ - theme: brand
13
+ text: Get Started
14
+ link: /guide/introduction/getting-started
15
+ - theme: alt
16
+ text: API Reference
17
+ link: /api/
18
+ - theme: alt
19
+ text: View on GitLab
20
+ link: https://gitlab.com/ersbeth-web/picoflow
21
+
22
+ features:
23
+ - icon: 🎯
24
+ title: Explicit Tracking
25
+ details: Full control over reactive dependencies with TrackingContext. Choose between reactive reads with get(t) and non-reactive reads with pick().
26
+
27
+ - icon: ⚡
28
+ title: Lazy Evaluation
29
+ details: Derivations compute only when accessed, not on construction. Smart caching ensures computations run only when dependencies change.
30
+
31
+ - icon: 🔧
32
+ title: Fine-grained Reactivity
33
+ details: Track specific operations on collections with reactive arrays and maps. Subscribe to additions, deletions, or entire collection changes.
34
+
35
+ - icon: 🧹
36
+ title: Resource Management
37
+ details: Automatic cleanup with dispose patterns. Manage async resources, streams, and effects with confidence.
38
+
39
+ - icon: 📦
40
+ title: Lightweight
41
+ details: Minimal bundle size with zero dependencies. Tree-shakeable exports ensure you only ship what you use.
42
+
43
+ - icon: 🔄
44
+ title: SolidJS Integration
45
+ details: Seamless integration with SolidJS through built-in converters. Use PicoFlow primitives directly in Solid components.
46
+ ---
47
+
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M176 120C189.3 120 200 130.7 200 144C200 157.3 189.3 168 176 168C162.7 168 152 157.3 152 144C152 130.7 162.7 120 176 120zM208.4 217.2C236.4 204.8 256 176.7 256 144C256 99.8 220.2 64 176 64C131.8 64 96 99.8 96 144C96 176.8 115.7 205 144 217.3L144 422.6C115.7 435 96 463.2 96 496C96 540.2 131.8 576 176 576C220.2 576 256 540.2 256 496C256 463.2 236.3 435 208 422.7L208 336.1C234.7 356.2 268 368.1 304 368.1L390.7 368.1C403 396.4 431.2 416.1 464 416.1C508.2 416.1 544 380.3 544 336.1C544 291.9 508.2 256.1 464 256.1C431.2 256.1 403 275.8 390.7 304.1L304 304C254.1 304 213 265.9 208.4 217.2zM176 472C189.3 472 200 482.7 200 496C200 509.3 189.3 520 176 520C162.7 520 152 509.3 152 496C152 482.7 162.7 472 176 472zM440 336C440 322.7 450.7 312 464 312C477.3 312 488 322.7 488 336C488 349.3 477.3 360 464 360C450.7 360 440 349.3 440 336z" fill="#5672cd"/></svg>
package/package.json CHANGED
@@ -1,43 +1,59 @@
1
1
  {
2
- "name": "@ersbeth/picoflow",
3
- "version": "0.2.3",
4
- "description": "Minimal Dataflow librairy for TypeScript",
5
- "type": "module",
6
- "exports": {
7
- "types": "./dist/types/index.d.ts",
8
- "default": "./dist/picoflow.js"
9
- },
10
- "imports": {
11
- "#package": "./src/index.ts"
12
- },
13
- "scripts": {
14
- "build": "npx vite build --config vite.config.ts",
15
- "format": "npx biome check --fix",
16
- "test": "npx vitest",
17
- "lint": "npx biome ci",
18
- "api:extract": "api-extractor run --local",
19
- "api:generate": "api-documenter markdown -i ./api/temp -o ./api/doc",
20
- "api:clean": "rm ./api/temp/*",
21
- "api": "npm run api:extract && npm run api:generate && npm run api:clean"
22
- },
23
- "peerDependencies": {
24
- "solid-js": "^1.9.7"
25
- },
26
- "devDependencies": {
27
- "@biomejs/biome": "^1.9.4",
28
- "@vitest/coverage-v8": "^3.0.9",
29
- "vite": "^6.2.3",
30
- "vite-plugin-dts": "^4.5.3",
31
- "vitest": "^3.0.9"
32
- },
33
- "repository": {
34
- "type": "git",
35
- "url": "git+ssh://git@gitlab.com/ersbeth-web/picoflow.git"
36
- },
37
- "author": "Elisabeth Rousset",
38
- "license": "MIT",
39
- "bugs": {
40
- "url": "https://gitlab.com/ersbeth-web/picoflow/issues"
41
- },
42
- "homepage": "https://gitlab.com/ersbeth-web/picoflow#readme"
2
+ "name": "@ersbeth/picoflow",
3
+ "version": "1.0.0",
4
+ "description": "Minimal Dataflow librairy for TypeScript",
5
+ "type": "module",
6
+ "exports": {
7
+ "types": "./dist/types/index.d.ts",
8
+ "default": "./dist/picoflow.js"
9
+ },
10
+ "imports": {
11
+ "#package": "./src/index.ts"
12
+ },
13
+ "scripts": {
14
+ "check": "pnpm exec tsc --noEmit",
15
+ "lint": "pnpm exec biome check --fix",
16
+ "build": "pnpm exec vite build --config vite.config.ts",
17
+ "test": "pnpm exec vitest",
18
+ "docs:dev": "vitepress dev docs",
19
+ "docs:build": "pnpm docs:generate && vitepress build docs",
20
+ "docs:preview": "vitepress preview docs",
21
+ "docs:generate": "typedoc",
22
+ "api:extract": "pnpm exec api-extractor run --local",
23
+ "api:generate": "pnpm exec api-documenter markdown -i ./api/temp -o ./api/doc",
24
+ "api:clean": "rm ./api/temp/*",
25
+ "api": "pnpm api:extract && pnpm api:generate && pnpm api:clean"
26
+ },
27
+ "peerDependencies": {
28
+ "solid-js": "^1.9.7"
29
+ },
30
+ "devDependencies": {
31
+ "@biomejs/biome": "2.3.8",
32
+ "@braintree/sanitize-url": "^7.1.1",
33
+ "@vitest/coverage-v8": "^3.0.9",
34
+ "cytoscape": "^3.33.1",
35
+ "cytoscape-cose-bilkent": "^4.1.0",
36
+ "dayjs": "^1.11.19",
37
+ "dompurify": "^3.3.0",
38
+ "mermaid": "^11.12.1",
39
+ "typedoc": "^0.28.15",
40
+ "typedoc-plugin-markdown": "^4.9.0",
41
+ "typedoc-vitepress-theme": "^1.1.2",
42
+ "typescript": "^5.9.3",
43
+ "vite": "^6.2.3",
44
+ "vite-plugin-dts": "^4.5.3",
45
+ "vitepress": "^1.6.4",
46
+ "vitepress-plugin-mermaid": "^2.0.17",
47
+ "vitest": "^3.0.9"
48
+ },
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+ssh://git@gitlab.com/ersbeth-web/picoflow.git"
52
+ },
53
+ "author": "Elisabeth Rousset",
54
+ "license": "MIT",
55
+ "bugs": {
56
+ "url": "https://gitlab.com/ersbeth-web/picoflow/issues"
57
+ },
58
+ "homepage": "https://gitlab.com/ersbeth-web/picoflow#readme"
43
59
  }
@@ -1,5 +1,4 @@
1
- import { FlowObservable, type FlowState } from "../basic";
2
- import { isDisposable } from "../basic";
1
+ import { FlowObservable, type FlowState, isDisposable } from "../basic";
3
2
  import { state } from "../creators";
4
3
 
5
4
  /**
@@ -7,218 +6,217 @@ import { state } from "../creators";
7
6
  * @public
8
7
  */
9
8
  export type FlowArrayAction<T> =
10
- | {
11
- type: "set";
12
- items: T[];
13
- }
14
- | {
15
- type: "setItem";
16
- index: number;
17
- item: T;
18
- }
19
- | {
20
- type: "push";
21
- item: T;
22
- }
23
- | {
24
- type: "pop";
25
- }
26
- | {
27
- type: "unshift";
28
- item: T;
29
- }
30
- | {
31
- type: "shift";
32
- }
33
- | {
34
- type: "splice";
35
- start: number;
36
- deleteCount: number;
37
- items: T[];
38
- }
39
- | {
40
- type: "clear";
41
- };
9
+ | {
10
+ type: "set";
11
+ items: T[];
12
+ }
13
+ | {
14
+ type: "setItem";
15
+ index: number;
16
+ item: T;
17
+ }
18
+ | {
19
+ type: "push";
20
+ item: T;
21
+ }
22
+ | {
23
+ type: "pop";
24
+ }
25
+ | {
26
+ type: "unshift";
27
+ item: T;
28
+ }
29
+ | {
30
+ type: "shift";
31
+ }
32
+ | {
33
+ type: "splice";
34
+ start: number;
35
+ deleteCount: number;
36
+ items: T[];
37
+ }
38
+ | {
39
+ type: "clear";
40
+ };
42
41
 
43
42
  /**
44
43
  * Represents a reactive array.
45
44
  * @public
46
45
  */
47
46
  export class FlowArray<T> extends FlowObservable<T[]> {
48
- /**
49
- * Last action performed on the FlowArray.
50
- * @public
51
- */
52
- $lastAction: FlowState<FlowArrayAction<T>>;
53
-
54
- /**
55
- * Creates an instance of FlowArray.
56
- * @param value - Initial array value.
57
- * @public
58
- */
59
- constructor(value: T[] = []) {
60
- super();
61
- this._value = value;
62
- this.$lastAction = state<FlowArrayAction<T>>({
63
- type: "set",
64
- items: value,
65
- });
66
- }
67
-
68
- /**
69
- * Gets the current length of the array.
70
- * @returns The length of the array.
71
- * @public
72
- */
73
- get length(): number {
74
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
75
- return this._value.length;
76
- }
77
-
78
- /**
79
- * Returns a copy of the internal array.
80
- * @returns A copy of the array.
81
- * @public
82
- */
83
- get(): T[] {
84
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
85
- return [...this._value]; // Ensure nobody can modify the original array
86
- }
87
-
88
- /**
89
- * Replaces the entire array with new items.
90
- * @param items - The new array of items.
91
- * @public
92
- */
93
- set(items: T[]): void {
94
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
95
- this._value.forEach((item) => {
96
- if (isDisposable(item)) item.dispose({ self: true });
97
- });
98
- this._value = items;
99
- this._notify();
100
- this.$lastAction.set({ type: "set", items: items });
101
- }
102
-
103
- /**
104
- * Replaces an item at a specific index.
105
- * @param index - The index of the item to replace.
106
- * @param item - The new item.
107
- * @public
108
- */
109
- setItem(index: number, item: T): void {
110
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
111
- if (index < 0 || index >= this._value.length) {
112
- throw new Error("[PicoFlow] Index out of bounds");
113
- }
114
- this._value[index] = item;
115
- this._notify();
116
- this.$lastAction.set({ type: "setItem", index: index, item: item });
117
- }
118
-
119
- /**
120
- * Appends an item to the end of the array.
121
- * @param item - The item to append.
122
- * @public
123
- */
124
- push(item: T): void {
125
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
126
- this._value.push(item);
127
- this._notify();
128
- this.$lastAction.set({ type: "push", item: item });
129
- }
130
-
131
- /**
132
- * Removes the last item from the array.
133
- * @public
134
- */
135
- pop(): void {
136
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
137
- const item = this._value.pop();
138
- if (isDisposable(item)) {
139
- item.dispose({ self: true });
140
- }
141
- this._notify();
142
- this.$lastAction.set({ type: "pop" });
143
- }
144
-
145
- /**
146
- * Inserts an item at the beginning of the array.
147
- * @param item - The item to insert.
148
- * @public
149
- */
150
- unshift(item: T): void {
151
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
152
- this._value.unshift(item);
153
- this._notify();
154
- this.$lastAction.set({ type: "unshift", item: item });
155
- }
156
-
157
- /**
158
- * Removes the first item from the array.
159
- * @public
160
- */
161
- shift(): void {
162
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
163
- const item = this._value.shift();
164
- if (isDisposable(item)) {
165
- item.dispose({ self: true });
166
- }
167
- this._notify();
168
- this.$lastAction.set({ type: "shift" });
169
- }
170
-
171
- /**
172
- * Changes the content of the array.
173
- * @param start - The starting index.
174
- * @param deleteCount - Number of items to remove.
175
- * @param newItems - New items to add.
176
- * @public
177
- */
178
- splice(start: number, deleteCount: number, ...newItems: T[]): void {
179
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
180
- const items = this._value.splice(start, deleteCount, ...newItems);
181
- items.forEach((item) => {
182
- if (isDisposable(item)) item.dispose({ self: true });
183
- });
184
- this._notify();
185
- this.$lastAction.set({
186
- type: "splice",
187
- start: start,
188
- deleteCount: deleteCount,
189
- items: newItems,
190
- });
191
- }
192
-
193
- /**
194
- * Clears all items from the array.
195
- * @public
196
- */
197
- clear(): void {
198
- if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
199
- const items = [...this._value];
200
- items.forEach((item) => {
201
- if (isDisposable(item)) item.dispose({ self: true });
202
- });
203
- this._value = [];
204
- this._notify();
205
- this.$lastAction.set({ type: "clear" });
206
- }
207
-
208
- /**
209
- * Disposes the FlowArray and its items.
210
- * @param options - Disposal options.
211
- * @public
212
- */
213
- override dispose(options?: { self: boolean }): void {
214
- super.dispose(options);
215
- this._value.forEach((item) => {
216
- if (isDisposable(item)) item.dispose(options);
217
- });
218
- this._value = [];
219
- }
220
-
221
- /* INTERNAL */
222
-
223
- /*@internal*/ protected override _value: T[] = [];
47
+ /**
48
+ * Last action performed on the FlowArray.
49
+ * @public
50
+ */
51
+ $lastAction: FlowState<FlowArrayAction<T>>;
52
+
53
+ /**
54
+ * Creates an instance of FlowArray.
55
+ * @param value - Initial array value.
56
+ * @public
57
+ */
58
+ constructor(value: T[] = []) {
59
+ super();
60
+ this._value = value;
61
+ this.$lastAction = state<FlowArrayAction<T>>({
62
+ type: "set",
63
+ items: value,
64
+ });
65
+ }
66
+
67
+ /**
68
+ * Gets the current length of the array.
69
+ * @returns The length of the array.
70
+ * @public
71
+ */
72
+ get length(): number {
73
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
74
+ return this._value.length;
75
+ }
76
+
77
+ /**
78
+ * Internal method to get the raw value.
79
+ * @internal
80
+ */
81
+ protected _getRaw(): T[] {
82
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
83
+ return [...this._value]; // Ensure nobody can modify the original array
84
+ }
85
+
86
+ /**
87
+ * Replaces the entire array with new items.
88
+ * @param items - The new array of items.
89
+ * @public
90
+ */
91
+ set(items: T[]): void {
92
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
93
+ this._value.forEach((item) => {
94
+ if (isDisposable(item)) item.dispose({ self: true });
95
+ });
96
+ this._value = items;
97
+ this._notify();
98
+ this.$lastAction.set({ type: "set", items: items });
99
+ }
100
+
101
+ /**
102
+ * Replaces an item at a specific index.
103
+ * @param index - The index of the item to replace.
104
+ * @param item - The new item.
105
+ * @public
106
+ */
107
+ setItem(index: number, item: T): void {
108
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
109
+ if (index < 0 || index >= this._value.length) {
110
+ throw new Error("[PicoFlow] Index out of bounds");
111
+ }
112
+ this._value[index] = item;
113
+ this._notify();
114
+ this.$lastAction.set({ type: "setItem", index: index, item: item });
115
+ }
116
+
117
+ /**
118
+ * Appends an item to the end of the array.
119
+ * @param item - The item to append.
120
+ * @public
121
+ */
122
+ push(item: T): void {
123
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
124
+ this._value.push(item);
125
+ this._notify();
126
+ this.$lastAction.set({ type: "push", item: item });
127
+ }
128
+
129
+ /**
130
+ * Removes the last item from the array.
131
+ * @public
132
+ */
133
+ pop(): void {
134
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
135
+ const item = this._value.pop();
136
+ if (isDisposable(item)) {
137
+ item.dispose({ self: true });
138
+ }
139
+ this._notify();
140
+ this.$lastAction.set({ type: "pop" });
141
+ }
142
+
143
+ /**
144
+ * Inserts an item at the beginning of the array.
145
+ * @param item - The item to insert.
146
+ * @public
147
+ */
148
+ unshift(item: T): void {
149
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
150
+ this._value.unshift(item);
151
+ this._notify();
152
+ this.$lastAction.set({ type: "unshift", item: item });
153
+ }
154
+
155
+ /**
156
+ * Removes the first item from the array.
157
+ * @public
158
+ */
159
+ shift(): void {
160
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
161
+ const item = this._value.shift();
162
+ if (isDisposable(item)) {
163
+ item.dispose({ self: true });
164
+ }
165
+ this._notify();
166
+ this.$lastAction.set({ type: "shift" });
167
+ }
168
+
169
+ /**
170
+ * Changes the content of the array.
171
+ * @param start - The starting index.
172
+ * @param deleteCount - Number of items to remove.
173
+ * @param newItems - New items to add.
174
+ * @public
175
+ */
176
+ splice(start: number, deleteCount: number, ...newItems: T[]): void {
177
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
178
+ const items = this._value.splice(start, deleteCount, ...newItems);
179
+ items.forEach((item) => {
180
+ if (isDisposable(item)) item.dispose({ self: true });
181
+ });
182
+ this._notify();
183
+ this.$lastAction.set({
184
+ type: "splice",
185
+ start: start,
186
+ deleteCount: deleteCount,
187
+ items: newItems,
188
+ });
189
+ }
190
+
191
+ /**
192
+ * Clears all items from the array.
193
+ * @public
194
+ */
195
+ clear(): void {
196
+ if (this._disposed) throw new Error("[PicoFlow] Primitive is disposed");
197
+ const items = [...this._value];
198
+ items.forEach((item) => {
199
+ if (isDisposable(item)) item.dispose({ self: true });
200
+ });
201
+ this._value = [];
202
+ this._notify();
203
+ this.$lastAction.set({ type: "clear" });
204
+ }
205
+
206
+ /**
207
+ * Disposes the FlowArray and its items.
208
+ * @param options - Disposal options.
209
+ * @public
210
+ */
211
+ override dispose(options?: { self: boolean }): void {
212
+ super.dispose(options);
213
+ this._value.forEach((item) => {
214
+ if (isDisposable(item)) item.dispose(options);
215
+ });
216
+ this._value = [];
217
+ }
218
+
219
+ /* INTERNAL */
220
+
221
+ /** @internal */ protected override _value: T[] = [];
224
222
  }
@@ -1,12 +1,12 @@
1
+ export type { FlowArrayAction } from "./array";
2
+ export { FlowArray } from "./array";
1
3
  export { FlowMap } from "./map";
2
- export { FlowStream } from "./stream";
3
- export { FlowStreamAsync } from "./streamAsync";
4
4
  export { FlowResource } from "./resource";
5
5
  export { FlowResourceAsync } from "./resourceAsync";
6
6
  export type {
7
- FlowStreamUpdater,
8
- FlowStreamDisposer,
9
- FlowStreamSetter,
7
+ FlowStreamDisposer,
8
+ FlowStreamSetter,
9
+ FlowStreamUpdater,
10
10
  } from "./stream";
11
- export { FlowArray } from "./array";
12
- export type { FlowArrayAction } from "./array";
11
+ export { FlowStream } from "./stream";
12
+ export { FlowStreamAsync } from "./streamAsync";