@ersbeth/picoflow 2.0.2 → 2.0.3

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 (152) hide show
  1. package/README.md +10 -0
  2. package/SKILL.md +106 -0
  3. package/package.json +5 -1
  4. package/.gitlab-ci.yml +0 -24
  5. package/.vscode/settings.json +0 -5
  6. package/CHANGELOG.md +0 -94
  7. package/biome.json +0 -47
  8. package/docs/.vitepress/config.mts +0 -145
  9. package/docs/api/functions/array.md +0 -35
  10. package/docs/api/functions/constant.md +0 -33
  11. package/docs/api/functions/constantAsync.md +0 -69
  12. package/docs/api/functions/derivation.md +0 -34
  13. package/docs/api/functions/derivationAsync.md +0 -34
  14. package/docs/api/functions/from.md +0 -129
  15. package/docs/api/functions/isDisposable.md +0 -27
  16. package/docs/api/functions/map.md +0 -36
  17. package/docs/api/functions/signal.md +0 -21
  18. package/docs/api/functions/state.md +0 -67
  19. package/docs/api/functions/stateAsync.md +0 -69
  20. package/docs/api/functions/subscribe.md +0 -40
  21. package/docs/api/functions/writableDerivation.md +0 -33
  22. package/docs/api/functions/writableDerivationAsync.md +0 -34
  23. package/docs/api/index.md +0 -61
  24. package/docs/api/interfaces/FlowArray.md +0 -439
  25. package/docs/api/interfaces/FlowConstant.md +0 -220
  26. package/docs/api/interfaces/FlowConstantAsync.md +0 -221
  27. package/docs/api/interfaces/FlowDerivation.md +0 -241
  28. package/docs/api/interfaces/FlowDerivationAsync.md +0 -242
  29. package/docs/api/interfaces/FlowDisposable.md +0 -59
  30. package/docs/api/interfaces/FlowEffect.md +0 -64
  31. package/docs/api/interfaces/FlowMap.md +0 -374
  32. package/docs/api/interfaces/FlowObservable.md +0 -155
  33. package/docs/api/interfaces/FlowSignal.md +0 -156
  34. package/docs/api/interfaces/FlowState.md +0 -269
  35. package/docs/api/interfaces/FlowStateAsync.md +0 -268
  36. package/docs/api/interfaces/FlowSubscribable.md +0 -55
  37. package/docs/api/interfaces/FlowTracker.md +0 -61
  38. package/docs/api/interfaces/FlowValue.md +0 -222
  39. package/docs/api/interfaces/FlowWritableDerivation.md +0 -292
  40. package/docs/api/interfaces/FlowWritableDerivationAsync.md +0 -293
  41. package/docs/api/type-aliases/DerivationFunction.md +0 -28
  42. package/docs/api/type-aliases/DerivationFunctionAsync.md +0 -28
  43. package/docs/api/type-aliases/FlowArrayAction.md +0 -60
  44. package/docs/api/type-aliases/FlowDataTracker.md +0 -33
  45. package/docs/api/type-aliases/FlowMapAction.md +0 -48
  46. package/docs/api/type-aliases/FlowOnDataListener.md +0 -33
  47. package/docs/api/type-aliases/FlowOnErrorListener.md +0 -27
  48. package/docs/api/type-aliases/FlowOnPendingListener.md +0 -21
  49. package/docs/api/type-aliases/FlowReadonly.md +0 -22
  50. package/docs/api/type-aliases/InitFunction.md +0 -21
  51. package/docs/api/type-aliases/InitFunctionAsync.md +0 -21
  52. package/docs/api/type-aliases/NotPromise.md +0 -21
  53. package/docs/api/type-aliases/UpdateFunction.md +0 -27
  54. package/docs/api/type-aliases/UpdateFunctionAsync.md +0 -27
  55. package/docs/api/typedoc-sidebar.json +0 -65
  56. package/docs/examples/examples.md +0 -2311
  57. package/docs/examples/patterns.md +0 -649
  58. package/docs/guide/advanced/architecture.md +0 -1234
  59. package/docs/guide/advanced/disposal.md +0 -426
  60. package/docs/guide/advanced/migration-v1.md +0 -464
  61. package/docs/guide/advanced/migration-v2.md +0 -204
  62. package/docs/guide/advanced/solidjs.md +0 -135
  63. package/docs/guide/introduction/concepts.md +0 -57
  64. package/docs/guide/introduction/conventions.md +0 -30
  65. package/docs/guide/introduction/getting-started.md +0 -139
  66. package/docs/guide/introduction/lifecycle.md +0 -368
  67. package/docs/guide/primitives/array.md +0 -286
  68. package/docs/guide/primitives/constant.md +0 -207
  69. package/docs/guide/primitives/derivations.md +0 -281
  70. package/docs/guide/primitives/effects.md +0 -372
  71. package/docs/guide/primitives/map.md +0 -265
  72. package/docs/guide/primitives/overview.md +0 -92
  73. package/docs/guide/primitives/signal.md +0 -222
  74. package/docs/guide/primitives/state.md +0 -272
  75. package/docs/index.md +0 -47
  76. package/docs/public/logo.svg +0 -1
  77. package/src/api/base/flowDisposable.ts +0 -44
  78. package/src/api/base/flowObservable.ts +0 -28
  79. package/src/api/base/flowSubscribable.ts +0 -87
  80. package/src/api/base/flowTracker.ts +0 -7
  81. package/src/api/base/index.ts +0 -4
  82. package/src/api/index.ts +0 -2
  83. package/src/api/nodes/async/flowConstantAsync.ts +0 -36
  84. package/src/api/nodes/async/flowDerivationAsync.ts +0 -42
  85. package/src/api/nodes/async/flowStateAsync.ts +0 -47
  86. package/src/api/nodes/async/flowWritableDerivationAsync.ts +0 -33
  87. package/src/api/nodes/async/index.ts +0 -4
  88. package/src/api/nodes/collections/flowArray.ts +0 -155
  89. package/src/api/nodes/collections/flowMap.ts +0 -115
  90. package/src/api/nodes/collections/index.ts +0 -2
  91. package/src/api/nodes/flowEffect.ts +0 -42
  92. package/src/api/nodes/flowSignal.ts +0 -28
  93. package/src/api/nodes/flowValue.ts +0 -37
  94. package/src/api/nodes/index.ts +0 -7
  95. package/src/api/nodes/sync/flowConstant.ts +0 -33
  96. package/src/api/nodes/sync/flowDerivation.ts +0 -41
  97. package/src/api/nodes/sync/flowState.ts +0 -45
  98. package/src/api/nodes/sync/flowWritableDerivation.ts +0 -31
  99. package/src/api/nodes/sync/index.ts +0 -4
  100. package/src/api/nodes/utils.ts +0 -24
  101. package/src/base/disposable.ts +0 -18
  102. package/src/base/executionStack.ts +0 -42
  103. package/src/base/index.ts +0 -5
  104. package/src/base/node.ts +0 -98
  105. package/src/base/observable.ts +0 -92
  106. package/src/base/observer.ts +0 -51
  107. package/src/converters/index.ts +0 -1
  108. package/src/converters/solid.ts +0 -109
  109. package/src/index.ts +0 -2
  110. package/src/nodes/arrayNode.ts +0 -180
  111. package/src/nodes/effectNode.ts +0 -58
  112. package/src/nodes/index.ts +0 -7
  113. package/src/nodes/mapNode.ts +0 -125
  114. package/src/nodes/signalNode.ts +0 -19
  115. package/src/nodes/valueAsyncNode.ts +0 -85
  116. package/src/nodes/valueNode.ts +0 -148
  117. package/src/nodes/valueSyncNode.ts +0 -125
  118. package/src/schedulers/asyncResolver.ts +0 -78
  119. package/src/schedulers/asyncScheduler.ts +0 -66
  120. package/src/schedulers/index.ts +0 -4
  121. package/src/schedulers/pendingError.ts +0 -13
  122. package/src/schedulers/scheduler.ts +0 -9
  123. package/src/schedulers/syncResolver.ts +0 -69
  124. package/src/schedulers/syncScheduler.ts +0 -55
  125. package/test/base/pendingError.test.ts +0 -67
  126. package/test/converters/solid.derivation.browser.test.tsx +0 -69
  127. package/test/converters/solid.node.test.ts +0 -654
  128. package/test/converters/solid.state.browser.test.tsx +0 -1592
  129. package/test/reactivity/flowSignal.test.ts +0 -226
  130. package/test/reactivity/nodes/async/asyncScheduler/asyncResolver.test.ts +0 -593
  131. package/test/reactivity/nodes/async/asyncScheduler/asyncScheduler.test.ts +0 -317
  132. package/test/reactivity/nodes/async/flowConstantAsync.test.ts +0 -652
  133. package/test/reactivity/nodes/async/flowDerivation.test.ts +0 -898
  134. package/test/reactivity/nodes/async/flowDerivationAsync.test.ts +0 -1716
  135. package/test/reactivity/nodes/async/flowStateAsync.test.ts +0 -708
  136. package/test/reactivity/nodes/async/flowWritableDerivationAsync.test.ts +0 -614
  137. package/test/reactivity/nodes/collections/flowArray.asyncStates.test.ts +0 -1289
  138. package/test/reactivity/nodes/collections/flowArray.scalars.test.ts +0 -961
  139. package/test/reactivity/nodes/collections/flowArray.states.test.ts +0 -1035
  140. package/test/reactivity/nodes/collections/flowMap.asyncStates.test.ts +0 -960
  141. package/test/reactivity/nodes/collections/flowMap.scalars.test.ts +0 -775
  142. package/test/reactivity/nodes/collections/flowMap.states.test.ts +0 -958
  143. package/test/reactivity/nodes/sync/flowConstant.test.ts +0 -377
  144. package/test/reactivity/nodes/sync/flowDerivation.test.ts +0 -896
  145. package/test/reactivity/nodes/sync/flowState.test.ts +0 -341
  146. package/test/reactivity/nodes/sync/flowWritableDerivation.test.ts +0 -603
  147. package/test/vitest.d.ts +0 -10
  148. package/tsconfig.json +0 -37
  149. package/typedoc.json +0 -37
  150. package/vite.config.ts +0 -31
  151. package/vitest.browser.config.ts +0 -21
  152. package/vitest.config.ts +0 -17
@@ -1,87 +0,0 @@
1
- import type { FlowEffect } from "../nodes/flowEffect";
2
- import type { FlowTracker } from "./flowTracker";
3
-
4
- /**
5
- * Function that tracks reactive dependencies and returns data.
6
- *
7
- * This function is called during effect execution with a tracker parameter that automatically
8
- * records any reactive values accessed. The tracker enables automatic dependency tracking without
9
- * explicit subscriptions. The returned data is passed to the `onData` callback.
10
- *
11
- * @param t - Tracker object that records dependencies when reactive values are accessed
12
- * @returns The computed data of type T
13
- *
14
- * @public
15
- */
16
- export type FlowDataTracker<T> = (t: FlowTracker) => T;
17
-
18
- /**
19
- * Callback invoked when new data is available.
20
- *
21
- * This callback runs each time the effect executes successfully, receiving the data returned
22
- * by the tracker function. It's called immediately on effect creation and then on every reactive
23
- * re-execution. Use this callback to perform side effects with the computed data.
24
- *
25
- * @param data - The computed data from the tracker function
26
- * @returns Always returns undefined (callbacks are for side effects)
27
- *
28
- * @public
29
- */
30
- export type FlowOnDataListener<T> = (data: T) => void;
31
-
32
- /**
33
- * Callback invoked when an error occurs during effect execution.
34
- *
35
- * If provided, this callback handles any errors thrown by the tracker function (except PendingError).
36
- * Without this callback, errors propagate and may crash the application. Use this for error logging,
37
- * recovery, or user feedback. The effect remains active and will retry on the next reactive trigger.
38
- *
39
- * @param error - The error that occurred, always normalized to an Error instance
40
- * @returns Always returns undefined (callbacks are for side effects)
41
- *
42
- * @public
43
- */
44
- export type FlowOnErrorListener = (error: Error) => void;
45
-
46
- /**
47
- * Callback invoked when an async computation is pending.
48
- *
49
- * This callback is triggered when the tracker function throws a PendingError, indicating that
50
- * async dependencies are still resolving. Use this to show loading states or pending indicators.
51
- * The effect will automatically re-execute once the async values settle.
52
- *
53
- * @returns Always returns undefined (callbacks are for side effects)
54
- *
55
- * @public
56
- */
57
- export type FlowOnPendingListener = () => void;
58
-
59
- /**
60
- * Contract for observables that can be subscribed to with lifecycle callbacks.
61
- *
62
- * This interface enables imperative subscription to reactive values, allowing manual control over
63
- * when effects run. The subscribe method returns a disposal function to stop the subscription.
64
- * Useful for integrating with non-reactive code or frameworks that manage subscriptions differently.
65
- *
66
- * @public
67
- */
68
- export interface FlowSubscribable<T> {
69
- /**
70
- * Subscribes to this observable with lifecycle callbacks.
71
- *
72
- * Creates an active subscription that executes immediately and then re-executes whenever
73
- * the observable's dependencies change. The subscription remains active until the returned
74
- * disposal function is called. The `onData` callback receives the computed value, while
75
- * `onError` handles errors and `onPending` signals async operations in progress.
76
- *
77
- * @param onData - Callback invoked with the computed data on each execution
78
- * @param onError - Optional callback for handling errors during execution
79
- * @param onPending - Optional callback invoked when async dependencies are pending
80
- * @returns A function to dispose the subscription and stop receiving updates
81
- */
82
- subscribe(
83
- onData: FlowOnDataListener<T>,
84
- onError?: FlowOnErrorListener,
85
- onPending?: FlowOnPendingListener,
86
- ): FlowEffect;
87
- }
@@ -1,7 +0,0 @@
1
- import type { FlowDisposable } from "./flowDisposable";
2
-
3
- /**
4
- * Contract for reactive computations that track dependencies and react to changes in the reactivity graph.
5
- * @public
6
- */
7
- export interface FlowTracker extends FlowDisposable {}
@@ -1,4 +0,0 @@
1
- export * from "./flowDisposable";
2
- export * from "./flowObservable";
3
- export * from "./flowSubscribable";
4
- export * from "./flowTracker";
package/src/api/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from "./base";
2
- export * from "./nodes";
@@ -1,36 +0,0 @@
1
- import { ValueAsyncNode } from "../../../nodes/valueAsyncNode";
2
- import type { FlowValue } from "../flowValue";
3
-
4
- /** Function that initializes a value asynchronously. */
5
- export type InitFunctionAsync<T> = () => Promise<T>;
6
-
7
- /**
8
- * Read-only reactive value that resolves once from a promise or async initializer.
9
- *
10
- * Async constants provide lazy initialization for asynchronous values. The promise or async initializer
11
- * runs once on first access, and the resolved value is cached forever. While pending, accessing the value
12
- * throws PendingError. Use for async operations that only need to run once, such as loading remote configuration,
13
- * fetching initial data, or computing expensive async resources.
14
- *
15
- * @public
16
- */
17
- export interface FlowConstantAsync<T> extends FlowValue<T> {}
18
-
19
- /**
20
- * Creates a constant reactive value from a promise or async initializer that resolves once and never recomputes.
21
- *
22
- * The promise or async initializer executes once on first access, and the resolved value is cached permanently.
23
- * While the promise is pending, any reactive computation that accesses the value will receive PendingError and
24
- * automatically retry once the promise resolves. Use for one-time async operations that don't depend on other
25
- * reactive values, such as loading configuration or fetching initial data.
26
- *
27
- * @param value - Promise to resolve, or async function that returns a promise on first access
28
- * @returns A FlowConstantAsync that provides read-only access to the resolved value
29
- *
30
- * @public
31
- */
32
- export function constantAsync<T>(value: Promise<T>): FlowConstantAsync<T>;
33
- export function constantAsync<T>(initializer: InitFunctionAsync<T>): FlowConstantAsync<T>;
34
- export function constantAsync<T>(valueOrInitializer: Promise<T> | InitFunctionAsync<T>): FlowConstantAsync<T> {
35
- return new ValueAsyncNode(valueOrInitializer);
36
- }
@@ -1,42 +0,0 @@
1
- import { ValueAsyncNode } from "../../../nodes/valueAsyncNode";
2
- import type { FlowTracker } from "../../base";
3
- import type { FlowValue } from "../flowValue";
4
- import type { NotPromise } from "../utils";
5
-
6
- /** Function that derives a value asynchronously from dependencies and optionally the previous value. */
7
- export type DerivationFunctionAsync<T> = (tracker: FlowTracker, previous?: NotPromise<T> | undefined) => Promise<T>;
8
-
9
- /**
10
- * Read-only reactive value that recomputes asynchronously when dependencies change.
11
- *
12
- * Async derivations track reactive values accessed during computation and automatically recompute when any
13
- * tracked dependency changes. The compute function returns a promise, and the resolved value is cached until
14
- * dependencies change. While recomputing, accessing the value throws PendingError. Use for values derived from
15
- * async operations like API calls, database queries, or any computation that depends on reactive state and
16
- * requires async work.
17
- *
18
- * @public
19
- */
20
- export interface FlowDerivationAsync<T> extends FlowValue<T> {
21
- /**
22
- * Forces the derivation to recompute even if dependencies haven't changed.
23
- */
24
- refresh(): void;
25
- }
26
-
27
- /**
28
- * Creates an async derived value that automatically recomputes when dependencies change.
29
- *
30
- * The async compute function tracks dependencies and returns a promise. When any tracked dependency changes,
31
- * the function runs again and returns a new promise. The resolved value is cached until the next change.
32
- * While the promise is pending, reactive computations that access this value receive PendingError and automatically
33
- * retry once resolved. Use for derived data from async sources like filtered API results or computed database queries.
34
- *
35
- * @param compute - Async function that accesses dependencies and returns a promise of the derived value
36
- * @returns A FlowDerivationAsync that provides read-only access to the resolved computed value
37
- *
38
- * @public
39
- */
40
- export function derivationAsync<T>(compute: DerivationFunctionAsync<T>): FlowDerivationAsync<T> {
41
- return new ValueAsyncNode(compute);
42
- }
@@ -1,47 +0,0 @@
1
- import { ValueAsyncNode } from "../../../nodes/valueAsyncNode";
2
- import type { FlowValue } from "../flowValue";
3
- import type { NotPromise } from "../utils";
4
- import type { InitFunctionAsync } from "./flowConstantAsync";
5
-
6
- /** Function that updates a value asynchronously based on the previous value. */
7
- export type UpdateFunctionAsync<T> = (previous: NotPromise<T> | undefined) => Promise<T>;
8
-
9
- /**
10
- * Writable reactive value that resolves promises and can be updated with new promises.
11
- *
12
- * Async state is the async equivalent of regular state. Unlike sync state, it accepts promises instead of
13
- * direct values. Set new promises or async updater functions to update the state. While a promise is pending,
14
- * accessing the value throws PendingError. Use for async data that changes imperatively, such as user-triggered
15
- * API calls, async form submissions, or any async operation that updates based on user actions.
16
- *
17
- * @public
18
- */
19
- export interface FlowStateAsync<T> extends FlowValue<T> {
20
- /**
21
- * Updates the state with a new promise or via an async updater function.
22
- * Notifies all dependents immediately (they will receive PendingError until resolved).
23
- *
24
- * @param promise - New promise to resolve, or async function that receives current value and returns a promise
25
- */
26
- set(promise: Promise<T>): void;
27
- set(updater: UpdateFunctionAsync<T>): void;
28
- }
29
-
30
- /**
31
- * Creates a mutable async reactive state that resolves promises and can be updated imperatively.
32
- *
33
- * State can be initialized with a direct promise or a lazy async initializer function. Update the state by
34
- * calling `set()` with a new promise or an async updater function. Changes propagate automatically to all
35
- * reactive computations that depend on this state. Use for async data that changes through user actions or
36
- * application logic, such as loading user profiles, fetching search results, or any async state updates.
37
- *
38
- * @param value - Initial promise to resolve, or lazy async initializer function
39
- * @returns A FlowStateAsync that can be read and modified with promises
40
- *
41
- * @public
42
- */
43
- export function stateAsync<T>(value: Promise<T>): FlowStateAsync<T>;
44
- export function stateAsync<T>(initializer: InitFunctionAsync<T>): FlowStateAsync<T>;
45
- export function stateAsync<T>(valueOrInitializer: Promise<T> | InitFunctionAsync<T>): FlowStateAsync<T> {
46
- return new ValueAsyncNode(valueOrInitializer);
47
- }
@@ -1,33 +0,0 @@
1
- import { ValueAsyncNode } from "../../../nodes/valueAsyncNode";
2
- import type { DerivationFunctionAsync, FlowDerivationAsync } from "./flowDerivationAsync";
3
- import type { FlowStateAsync } from "./flowStateAsync";
4
-
5
- /**
6
- * Writable reactive value that recomputes asynchronously when dependencies change, but can be manually overridden.
7
- *
8
- * Async writable derivations combine reactive async computation with manual control. They track dependencies and
9
- * recompute asynchronously like regular async derivations, but you can also call `set()` to override the computed
10
- * value with a new promise. While recomputing or pending, accessing the value throws PendingError. Use for computed
11
- * async values that users can edit, such as formatted async fields, calculated async totals that can be adjusted,
12
- * or any async value that is usually derived but sometimes needs manual correction.
13
- *
14
- * @public
15
- */
16
- export interface FlowWritableDerivationAsync<T> extends FlowStateAsync<T>, FlowDerivationAsync<T> {}
17
-
18
- /**
19
- * Creates an async derived value that recomputes automatically but can also be manually overridden.
20
- *
21
- * The async compute function tracks dependencies and returns a promise. When any tracked dependency changes,
22
- * the function runs again and returns a new promise. However, you can also call `set()` to override the computed
23
- * value with a new promise. Use for async values that are normally derived but need occasional manual adjustments,
24
- * such as editable async calculated fields or user-correctable async totals.
25
- *
26
- * @param compute - Async function that accesses dependencies and returns a promise of the derived value
27
- * @returns A FlowWritableDerivationAsync that provides both reactive async computation and manual control
28
- *
29
- * @public
30
- */
31
- export function writableDerivationAsync<T>(compute: DerivationFunctionAsync<T>): FlowWritableDerivationAsync<T> {
32
- return new ValueAsyncNode(compute);
33
- }
@@ -1,4 +0,0 @@
1
- export * from "./flowConstantAsync";
2
- export * from "./flowDerivationAsync";
3
- export * from "./flowStateAsync";
4
- export * from "./flowWritableDerivationAsync";
@@ -1,155 +0,0 @@
1
- import { ArrayNode } from "../../../nodes/arrayNode";
2
- import type { FlowState } from "../sync/flowState";
3
-
4
- /**
5
- * Discriminated union representing all possible array mutation operations.
6
- *
7
- * Each mutation on a FlowArray emits an action describing what changed. This enables fine-grained
8
- * reactive tracking - you can observe the array itself or subscribe to `$lastAction` to react only
9
- * to specific mutations. Use this for optimized rendering, undo/redo systems, or any scenario where
10
- * you need to know exactly what changed rather than just that something changed.
11
- *
12
- * @public
13
- */
14
- export type FlowArrayAction<T> =
15
- | {
16
- type: "set";
17
- setItems: T[];
18
- clearedItems: T[];
19
- }
20
- | {
21
- type: "update";
22
- index: number;
23
- setItem: T;
24
- clearedItem: T | undefined;
25
- }
26
- | {
27
- type: "push";
28
- addedItem: T;
29
- }
30
- | {
31
- type: "pop";
32
- removedItem: T | undefined;
33
- }
34
- | {
35
- type: "unshift";
36
- addedItem: T;
37
- }
38
- | {
39
- type: "shift";
40
- removedItem: T | undefined;
41
- }
42
- | {
43
- type: "splice";
44
- start: number;
45
- deleteCount: number;
46
- addedItems: T[];
47
- removedItems: T[];
48
- }
49
- | {
50
- type: "clear";
51
- clearedItems: T[];
52
- };
53
-
54
- /**
55
- * Reactive array with standard mutation methods and fine-grained change tracking.
56
- *
57
- * FlowArray behaves like a regular array but notifies dependents on mutations. It provides all standard
58
- * array mutation methods (push, pop, splice, etc.) and tracks each operation via the `$lastAction` signal.
59
- * This enables both coarse-grained reactivity (reacting to any change) and fine-grained reactivity (reacting
60
- * only to specific mutations). Use for lists that need reactive updates, such as todo lists, data tables,
61
- * or any collection that changes over time.
62
- *
63
- * @public
64
- */
65
- export interface FlowArray<T> extends FlowState<T[]> {
66
- /**
67
- * Replaces an item at a specific index.
68
- * Emits an "update" action to $lastAction.
69
- *
70
- * @param index - The index of the item to replace
71
- * @param item - The new item
72
- * @returns The previous item at that index
73
- */
74
- update(index: number, item: T): T | undefined;
75
-
76
- /**
77
- * Appends an item to the end of the array.
78
- * Emits a "push" action to $lastAction.
79
- *
80
- * @param item - The item to append
81
- */
82
- push(item: T): void;
83
-
84
- /**
85
- * Removes and returns the last item from the array.
86
- * Emits a "pop" action to $lastAction.
87
- *
88
- * @returns The removed item, or undefined if the array was empty
89
- */
90
- pop(): T | undefined;
91
-
92
- /**
93
- * Inserts an item at the beginning of the array.
94
- * Emits an "unshift" action to $lastAction.
95
- *
96
- * @param item - The item to insert
97
- */
98
- unshift(item: T): void;
99
-
100
- /**
101
- * Removes and returns the first item from the array.
102
- * Emits a "shift" action to $lastAction.
103
- *
104
- * @returns The removed item, or undefined if the array was empty
105
- */
106
- shift(): T | undefined;
107
-
108
- /**
109
- * Changes the content of the array by removing, replacing, or adding items.
110
- * Emits a "splice" action to $lastAction.
111
- *
112
- * @param start - The starting index
113
- * @param deleteCount - Number of items to remove
114
- * @param newItems - New items to add at the start position
115
- * @returns Array of removed items
116
- */
117
- splice(start: number, deleteCount: number, ...newItems: T[]): T[];
118
-
119
- /**
120
- * Removes all items from the array.
121
- * Emits a "clear" action to $lastAction.
122
- *
123
- * @returns Array of all removed items
124
- */
125
- clear(): T[];
126
-
127
- /**
128
- * The current length of the array.
129
- */
130
- length: number;
131
-
132
- /**
133
- * Reactive state containing the last mutation operation performed on the array.
134
- * Subscribe to this for fine-grained reactivity to specific mutation types.
135
- */
136
- $lastAction: FlowState<FlowArrayAction<T>>;
137
- }
138
-
139
- /**
140
- * Creates a reactive array with mutation methods and fine-grained action tracking.
141
- *
142
- * The array starts with the provided initial items (or empty if none provided). All mutation methods
143
- * (push, pop, splice, etc.) notify dependents and emit detailed action information to `$lastAction`.
144
- * Use the array itself for coarse-grained reactivity, or subscribe to `$lastAction` for fine-grained
145
- * reactivity to specific mutation types. Useful for reactive lists, collections, or any data that
146
- * needs array-like operations with automatic change propagation.
147
- *
148
- * @param initial - Optional initial array of items
149
- * @returns A FlowArray with reactive mutation methods
150
- *
151
- * @public
152
- */
153
- export function array<T>(initial?: T[]): FlowArray<T> {
154
- return new ArrayNode<T>(initial);
155
- }
@@ -1,115 +0,0 @@
1
- import { MapNode } from "../../../nodes/mapNode";
2
- import type { FlowState } from "../sync/flowState";
3
-
4
- /**
5
- * Discriminated union representing all possible map mutation operations.
6
- *
7
- * Each mutation on a FlowMap emits an action describing what changed. This enables fine-grained
8
- * reactive tracking - you can observe the map itself or subscribe to `$lastAction` to react only
9
- * to specific mutations. Use this for optimized updates, undo/redo systems, or any scenario where
10
- * you need to know exactly what changed rather than just that something changed.
11
- *
12
- * @public
13
- */
14
- export type FlowMapAction<K, V> =
15
- | {
16
- type: "set";
17
- setMap: Map<K, V>;
18
- clearedMap: Map<K, V>;
19
- }
20
- | {
21
- type: "add";
22
- key: K;
23
- addedValue: V;
24
- }
25
- | {
26
- type: "update";
27
- key: K;
28
- setValue: V;
29
- clearedValue: V;
30
- }
31
- | {
32
- type: "delete";
33
- key: K;
34
- removedValue: V;
35
- }
36
- | {
37
- type: "clear";
38
- clearedMap: Map<K, V>;
39
- };
40
-
41
- /**
42
- * Reactive map with standard mutation methods and fine-grained change tracking.
43
- *
44
- * FlowMap behaves like a regular Map but notifies dependents on mutations. It provides standard
45
- * map operations (add, update, delete) and tracks each operation via the `$lastAction` signal.
46
- * This enables both coarse-grained reactivity (reacting to any change) and fine-grained reactivity
47
- * (reacting only to specific mutations). Use for key-value collections that need reactive updates,
48
- * such as entity stores, lookup tables, or any map-based data that changes over time.
49
- *
50
- * @public
51
- */
52
- export interface FlowMap<K, V> extends FlowState<Map<K, V>> {
53
- /**
54
- * Removes a key-value pair from the map.
55
- * Emits a "delete" action to $lastAction.
56
- *
57
- * @param key - The key to delete
58
- * @returns The deleted value
59
- */
60
- delete(key: K): V;
61
-
62
- /**
63
- * Updates an existing key-value pair in the map.
64
- * Emits an "update" action to $lastAction.
65
- *
66
- * @param key - The key to update (must exist)
67
- * @param value - The new value
68
- * @returns The previous value
69
- */
70
- update(key: K, value: V): V | undefined;
71
-
72
- /**
73
- * Adds a new key-value pair to the map.
74
- * Emits an "add" action to $lastAction.
75
- *
76
- * @param key - The key to add (must not exist)
77
- * @param value - The value to associate with the key
78
- */
79
- add(key: K, value: V): void;
80
-
81
- /**
82
- * Removes all entries from the map.
83
- * Emits a "clear" action to $lastAction.
84
- *
85
- * @returns Map of all removed entries
86
- */
87
- clear(): Map<K, V>;
88
-
89
- /**
90
- * Reactive state containing the last mutation operation performed on the map.
91
- * Subscribe to this for fine-grained reactivity to specific mutation types.
92
- */
93
- $lastAction: FlowState<FlowMapAction<K, V>>;
94
- }
95
-
96
- /**
97
- * Creates a reactive map with mutation methods and fine-grained action tracking.
98
- *
99
- * The map starts with the provided initial entries (or empty if none provided). All mutation methods
100
- * (add, update, delete) notify dependents and emit detailed action information to `$lastAction`.
101
- * Use the map itself for coarse-grained reactivity, or subscribe to `$lastAction` for fine-grained
102
- * reactivity to specific mutation types. Useful for entity stores, lookup tables, or any key-value
103
- * data that needs reactive updates.
104
- *
105
- * @param initial - Optional initial entries as a Record or Map
106
- * @returns A FlowMap with reactive mutation methods
107
- *
108
- * @public
109
- */
110
- export function map<K extends string | number | symbol, V>(initial?: Record<K, V> | Map<K, V>): FlowMap<K, V> {
111
- if (initial instanceof Map) {
112
- return new MapNode<K, V>(initial);
113
- }
114
- return new MapNode<K, V>(new Map<K, V>(initial ? (Object.entries(initial) as [K, V][]) : []));
115
- }
@@ -1,2 +0,0 @@
1
- export * from "./flowArray";
2
- export * from "./flowMap";
@@ -1,42 +0,0 @@
1
- import { EffectNode } from "../../nodes/effectNode";
2
- import type { FlowDisposable } from "../base/flowDisposable";
3
- import type {
4
- FlowDataTracker,
5
- FlowOnDataListener,
6
- FlowOnErrorListener,
7
- FlowOnPendingListener,
8
- } from "../base/flowSubscribable";
9
-
10
- /**
11
- * Handle to a reactive effect that automatically tracks dependencies and re-executes when they change.
12
- *
13
- * Effects run immediately upon creation and then reactively respond to changes in any reactive values
14
- * accessed during execution. Call `dispose()` to stop the effect and clean up its subscriptions.
15
- *
16
- * @public
17
- */
18
- export interface FlowEffect extends FlowDisposable {}
19
-
20
- /**
21
- * Creates a reactive effect that runs immediately and automatically re-runs when dependencies change.
22
- *
23
- * The effect function tracks any reactive values accessed and subscribes to their changes.
24
- * When any tracked value changes, the effect re-executes with the new values.
25
- * Optional callbacks handle errors and pending async states.
26
- *
27
- * @param data - Function that accesses reactive dependencies and returns data
28
- * @param onData - Callback invoked with the computed data on each execution
29
- * @param onError - Optional callback for handling errors during execution
30
- * @param onPending - Optional callback invoked when async dependencies are pending
31
- * @returns A FlowEffect handle with a `dispose()` method to stop the effect
32
- *
33
- * @public
34
- */
35
- export function subscribe<T>(
36
- data: FlowDataTracker<T>,
37
- onData: FlowOnDataListener<T>,
38
- onError?: FlowOnErrorListener,
39
- onPending?: FlowOnPendingListener,
40
- ): FlowEffect {
41
- return new EffectNode(data, onData, onError, onPending);
42
- }
@@ -1,28 +0,0 @@
1
- import { SignalNode } from "../../nodes/signalNode";
2
- import type { FlowObservable } from "../base/flowObservable";
3
-
4
- /**
5
- * Manual trigger that notifies subscribers without carrying data.
6
- *
7
- * Unlike reactive state or derivations, signals don't hold values. They serve as event emitters
8
- * that notify dependents when explicitly triggered. Use signals for side effects that should run
9
- * in response to manual actions rather than data changes.
10
- *
11
- * @public
12
- */
13
- export interface FlowSignal extends FlowObservable<void> {}
14
-
15
- /**
16
- * Creates a signal that can be manually triggered to notify dependents.
17
- *
18
- * Signals act as event emitters in the reactive graph. Call `trigger()` to notify all subscribers
19
- * and reactive computations that depend on the signal. Unlike state or derivations, signals don't
20
- * carry data values - they simply represent that an event occurred.
21
- *
22
- * @returns A FlowSignal that can be triggered manually and subscribed to
23
- *
24
- * @public
25
- */
26
- export function signal(): FlowSignal {
27
- return new SignalNode();
28
- }
@@ -1,37 +0,0 @@
1
- import type { FlowObservable } from "../base/flowObservable";
2
- import type { FlowTracker } from "../base/flowTracker";
3
-
4
- /**
5
- * Base interface for reactive values that can be read synchronously or asynchronously.
6
- *
7
- * FlowValue extends FlowObservable with methods to access the current value. Use `get()` to read
8
- * the value reactively (establishing a dependency), or `pick()` to read it non-reactively. All
9
- * value-based primitives (state, derivation, constant, and their async variants) implement this
10
- * interface, providing a consistent API for value access across the reactive system.
11
- *
12
- * @public
13
- */
14
- export interface FlowValue<T> extends FlowObservable<T> {
15
- /**
16
- * Gets the current value and establishes a reactive dependency.
17
- *
18
- * When called from within a reactive computation, this method registers the value as a dependency,
19
- * ensuring the computation re-executes when the value changes. The value is computed on first access
20
- * (if lazy) and then cached. For async values, throws PendingError while the value is resolving.
21
- *
22
- * @param tracker - Tracker that records this value as a dependency
23
- * @returns The current value
24
- */
25
- get(tracker: FlowTracker): T;
26
-
27
- /**
28
- * Asynchronously gets the current value without establishing a reactive dependency.
29
- *
30
- * This method reads the value non-reactively, meaning it won't trigger re-execution of the calling
31
- * computation when the value changes. The value is computed on first access (if lazy) and then cached.
32
- * For async values, the promise resolves once the value is available.
33
- *
34
- * @returns Promise that resolves with the current value
35
- */
36
- pick(): Promise<T>;
37
- }
@@ -1,7 +0,0 @@
1
- export * from "./async";
2
- export * from "./collections";
3
- export * from "./flowEffect";
4
- export * from "./flowSignal";
5
- export * from "./flowValue";
6
- export * from "./sync";
7
- export * from "./utils";