@ersbeth/picoflow 1.0.0 → 1.1.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 (180) hide show
  1. package/.cursor/plans/unifier-flowresource-avec-flowderivation-c9506e24.plan.md +372 -0
  2. package/README.md +25 -171
  3. package/biome.json +4 -1
  4. package/dist/picoflow.js +1129 -661
  5. package/dist/types/flow/base/flowDisposable.d.ts +67 -0
  6. package/dist/types/flow/base/flowDisposable.d.ts.map +1 -0
  7. package/dist/types/flow/base/flowEffect.d.ts +127 -0
  8. package/dist/types/flow/base/flowEffect.d.ts.map +1 -0
  9. package/dist/types/flow/base/flowGraph.d.ts +97 -0
  10. package/dist/types/flow/base/flowGraph.d.ts.map +1 -0
  11. package/dist/types/flow/base/flowSignal.d.ts +134 -0
  12. package/dist/types/flow/base/flowSignal.d.ts.map +1 -0
  13. package/dist/types/flow/base/flowTracker.d.ts +15 -0
  14. package/dist/types/flow/base/flowTracker.d.ts.map +1 -0
  15. package/dist/types/flow/base/index.d.ts +7 -0
  16. package/dist/types/flow/base/index.d.ts.map +1 -0
  17. package/dist/types/flow/base/utils.d.ts +20 -0
  18. package/dist/types/flow/base/utils.d.ts.map +1 -0
  19. package/dist/types/{advanced/array.d.ts → flow/collections/flowArray.d.ts} +50 -12
  20. package/dist/types/flow/collections/flowArray.d.ts.map +1 -0
  21. package/dist/types/flow/collections/flowMap.d.ts +224 -0
  22. package/dist/types/flow/collections/flowMap.d.ts.map +1 -0
  23. package/dist/types/flow/collections/index.d.ts +3 -0
  24. package/dist/types/flow/collections/index.d.ts.map +1 -0
  25. package/dist/types/flow/index.d.ts +4 -0
  26. package/dist/types/flow/index.d.ts.map +1 -0
  27. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts +137 -0
  28. package/dist/types/flow/nodes/async/flowConstantAsync.d.ts.map +1 -0
  29. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts +137 -0
  30. package/dist/types/flow/nodes/async/flowDerivationAsync.d.ts.map +1 -0
  31. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts +343 -0
  32. package/dist/types/flow/nodes/async/flowNodeAsync.d.ts.map +1 -0
  33. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts +81 -0
  34. package/dist/types/flow/nodes/async/flowReadonlyAsync.d.ts.map +1 -0
  35. package/dist/types/flow/nodes/async/flowStateAsync.d.ts +111 -0
  36. package/dist/types/flow/nodes/async/flowStateAsync.d.ts.map +1 -0
  37. package/dist/types/flow/nodes/async/index.d.ts +6 -0
  38. package/dist/types/flow/nodes/async/index.d.ts.map +1 -0
  39. package/dist/types/flow/nodes/index.d.ts +3 -0
  40. package/dist/types/flow/nodes/index.d.ts.map +1 -0
  41. package/dist/types/flow/nodes/sync/flowConstant.d.ts +108 -0
  42. package/dist/types/flow/nodes/sync/flowConstant.d.ts.map +1 -0
  43. package/dist/types/flow/nodes/sync/flowDerivation.d.ts +100 -0
  44. package/dist/types/flow/nodes/sync/flowDerivation.d.ts.map +1 -0
  45. package/dist/types/flow/nodes/sync/flowNode.d.ts +314 -0
  46. package/dist/types/flow/nodes/sync/flowNode.d.ts.map +1 -0
  47. package/dist/types/flow/nodes/sync/flowReadonly.d.ts +57 -0
  48. package/dist/types/flow/nodes/sync/flowReadonly.d.ts.map +1 -0
  49. package/dist/types/flow/nodes/sync/flowState.d.ts +96 -0
  50. package/dist/types/flow/nodes/sync/flowState.d.ts.map +1 -0
  51. package/dist/types/flow/nodes/sync/index.d.ts +6 -0
  52. package/dist/types/flow/nodes/sync/index.d.ts.map +1 -0
  53. package/dist/types/index.d.ts +1 -4
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/solid/converters.d.ts +34 -44
  56. package/dist/types/solid/converters.d.ts.map +1 -1
  57. package/dist/types/solid/primitives.d.ts +1 -0
  58. package/dist/types/solid/primitives.d.ts.map +1 -1
  59. package/docs/.vitepress/config.mts +1 -1
  60. package/docs/api/typedoc-sidebar.json +81 -1
  61. package/package.json +60 -58
  62. package/src/flow/base/flowDisposable.ts +71 -0
  63. package/src/flow/base/flowEffect.ts +171 -0
  64. package/src/flow/base/flowGraph.ts +288 -0
  65. package/src/flow/base/flowSignal.ts +207 -0
  66. package/src/flow/base/flowTracker.ts +17 -0
  67. package/src/flow/base/index.ts +6 -0
  68. package/src/flow/base/utils.ts +19 -0
  69. package/src/flow/collections/flowArray.ts +409 -0
  70. package/src/flow/collections/flowMap.ts +398 -0
  71. package/src/flow/collections/index.ts +2 -0
  72. package/src/flow/index.ts +3 -0
  73. package/src/flow/nodes/async/flowConstantAsync.ts +142 -0
  74. package/src/flow/nodes/async/flowDerivationAsync.ts +143 -0
  75. package/src/flow/nodes/async/flowNodeAsync.ts +474 -0
  76. package/src/flow/nodes/async/flowReadonlyAsync.ts +81 -0
  77. package/src/flow/nodes/async/flowStateAsync.ts +116 -0
  78. package/src/flow/nodes/async/index.ts +5 -0
  79. package/src/flow/nodes/await/advanced/index.ts +5 -0
  80. package/src/{advanced → flow/nodes/await/advanced}/resource.ts +37 -3
  81. package/src/{advanced → flow/nodes/await/advanced}/resourceAsync.ts +35 -3
  82. package/src/{advanced → flow/nodes/await/advanced}/stream.ts +40 -2
  83. package/src/{advanced → flow/nodes/await/advanced}/streamAsync.ts +38 -3
  84. package/src/flow/nodes/await/flowConstantAwait.ts +154 -0
  85. package/src/flow/nodes/await/flowDerivationAwait.ts +154 -0
  86. package/src/flow/nodes/await/flowNodeAwait.ts +508 -0
  87. package/src/flow/nodes/await/flowReadonlyAwait.ts +89 -0
  88. package/src/flow/nodes/await/flowStateAwait.ts +130 -0
  89. package/src/flow/nodes/await/index.ts +5 -0
  90. package/src/flow/nodes/index.ts +3 -0
  91. package/src/flow/nodes/sync/flowConstant.ts +111 -0
  92. package/src/flow/nodes/sync/flowDerivation.ts +105 -0
  93. package/src/flow/nodes/sync/flowNode.ts +439 -0
  94. package/src/flow/nodes/sync/flowReadonly.ts +57 -0
  95. package/src/flow/nodes/sync/flowState.ts +101 -0
  96. package/src/flow/nodes/sync/index.ts +5 -0
  97. package/src/index.ts +1 -47
  98. package/src/solid/converters.ts +59 -198
  99. package/src/solid/primitives.ts +4 -0
  100. package/test/base/flowEffect.test.ts +108 -0
  101. package/test/base/flowGraph.test.ts +485 -0
  102. package/test/base/flowSignal.test.ts +372 -0
  103. package/test/collections/flowArray.asyncStates.test.ts +1553 -0
  104. package/test/collections/flowArray.scalars.test.ts +1129 -0
  105. package/test/collections/flowArray.states.test.ts +1365 -0
  106. package/test/collections/flowMap.asyncStates.test.ts +1105 -0
  107. package/test/collections/flowMap.scalars.test.ts +877 -0
  108. package/test/collections/flowMap.states.test.ts +1097 -0
  109. package/test/nodes/async/flowConstantAsync.test.ts +860 -0
  110. package/test/nodes/async/flowDerivationAsync.test.ts +1517 -0
  111. package/test/nodes/async/flowStateAsync.test.ts +1387 -0
  112. package/test/{resource.test.ts → nodes/await/advanced/resource.test.ts} +21 -19
  113. package/test/{resourceAsync.test.ts → nodes/await/advanced/resourceAsync.test.ts} +3 -1
  114. package/test/{stream.test.ts → nodes/await/advanced/stream.test.ts} +30 -28
  115. package/test/{streamAsync.test.ts → nodes/await/advanced/streamAsync.test.ts} +16 -14
  116. package/test/nodes/await/flowConstantAwait.test.ts +643 -0
  117. package/test/nodes/await/flowDerivationAwait.test.ts +1583 -0
  118. package/test/nodes/await/flowStateAwait.test.ts +999 -0
  119. package/test/nodes/mixed/derivation.test.ts +1527 -0
  120. package/test/nodes/sync/flowConstant.test.ts +620 -0
  121. package/test/nodes/sync/flowDerivation.test.ts +1373 -0
  122. package/test/nodes/sync/flowState.test.ts +945 -0
  123. package/test/solid/converters.test.ts +721 -0
  124. package/test/solid/primitives.test.ts +1031 -0
  125. package/tsconfig.json +2 -1
  126. package/vitest.config.ts +7 -1
  127. package/IMPLEMENTATION_GUIDE.md +0 -1578
  128. package/dist/types/advanced/array.d.ts.map +0 -1
  129. package/dist/types/advanced/index.d.ts +0 -9
  130. package/dist/types/advanced/index.d.ts.map +0 -1
  131. package/dist/types/advanced/map.d.ts +0 -166
  132. package/dist/types/advanced/map.d.ts.map +0 -1
  133. package/dist/types/advanced/resource.d.ts +0 -78
  134. package/dist/types/advanced/resource.d.ts.map +0 -1
  135. package/dist/types/advanced/resourceAsync.d.ts +0 -56
  136. package/dist/types/advanced/resourceAsync.d.ts.map +0 -1
  137. package/dist/types/advanced/stream.d.ts +0 -117
  138. package/dist/types/advanced/stream.d.ts.map +0 -1
  139. package/dist/types/advanced/streamAsync.d.ts +0 -97
  140. package/dist/types/advanced/streamAsync.d.ts.map +0 -1
  141. package/dist/types/basic/constant.d.ts +0 -60
  142. package/dist/types/basic/constant.d.ts.map +0 -1
  143. package/dist/types/basic/derivation.d.ts +0 -89
  144. package/dist/types/basic/derivation.d.ts.map +0 -1
  145. package/dist/types/basic/disposable.d.ts +0 -82
  146. package/dist/types/basic/disposable.d.ts.map +0 -1
  147. package/dist/types/basic/effect.d.ts +0 -67
  148. package/dist/types/basic/effect.d.ts.map +0 -1
  149. package/dist/types/basic/index.d.ts +0 -10
  150. package/dist/types/basic/index.d.ts.map +0 -1
  151. package/dist/types/basic/observable.d.ts +0 -83
  152. package/dist/types/basic/observable.d.ts.map +0 -1
  153. package/dist/types/basic/signal.d.ts +0 -69
  154. package/dist/types/basic/signal.d.ts.map +0 -1
  155. package/dist/types/basic/state.d.ts +0 -47
  156. package/dist/types/basic/state.d.ts.map +0 -1
  157. package/dist/types/basic/trackingContext.d.ts +0 -33
  158. package/dist/types/basic/trackingContext.d.ts.map +0 -1
  159. package/dist/types/creators.d.ts +0 -340
  160. package/dist/types/creators.d.ts.map +0 -1
  161. package/src/advanced/array.ts +0 -222
  162. package/src/advanced/index.ts +0 -12
  163. package/src/advanced/map.ts +0 -193
  164. package/src/basic/constant.ts +0 -97
  165. package/src/basic/derivation.ts +0 -147
  166. package/src/basic/disposable.ts +0 -86
  167. package/src/basic/effect.ts +0 -104
  168. package/src/basic/index.ts +0 -9
  169. package/src/basic/observable.ts +0 -109
  170. package/src/basic/signal.ts +0 -145
  171. package/src/basic/state.ts +0 -60
  172. package/src/basic/trackingContext.ts +0 -45
  173. package/src/creators.ts +0 -395
  174. package/test/array.test.ts +0 -600
  175. package/test/constant.test.ts +0 -44
  176. package/test/derivation.test.ts +0 -539
  177. package/test/effect.test.ts +0 -29
  178. package/test/map.test.ts +0 -240
  179. package/test/signal.test.ts +0 -72
  180. package/test/state.test.ts +0 -212
@@ -10,13 +10,13 @@ describe("resource", () => {
10
10
  };
11
11
 
12
12
  const $resource = resource(fetchResource);
13
- expect($resource.pick()).toBe(undefined);
13
+ expect(await $resource.pick()).toBe(undefined);
14
14
 
15
15
  await $resource.fetch();
16
- expect($resource.pick()).toBe(1);
16
+ expect(await $resource.pick()).toBe(1);
17
17
 
18
18
  await $resource.fetch();
19
- expect($resource.pick()).toBe(2);
19
+ expect(await $resource.pick()).toBe(2);
20
20
  });
21
21
 
22
22
  test("fetch throws when disposed", async () => {
@@ -27,10 +27,10 @@ describe("resource", () => {
27
27
  };
28
28
 
29
29
  const $resource = resource(fetchResource);
30
- expect($resource.pick()).toBe(undefined);
30
+ expect(await $resource.pick()).toBe(undefined);
31
31
 
32
32
  await $resource.fetch();
33
- expect($resource.pick()).toBe(1);
33
+ expect(await $resource.pick()).toBe(1);
34
34
 
35
35
  $resource.dispose();
36
36
  await expect(() => $resource.fetch()).rejects.toThrow(
@@ -46,13 +46,15 @@ describe("resource", () => {
46
46
  };
47
47
 
48
48
  const $resource = resource(fetchResource);
49
- expect($resource.pick()).toBe(undefined);
49
+ expect(await $resource.pick()).toBe(undefined);
50
50
 
51
51
  await $resource.fetch();
52
- expect($resource.pick()).toBe(1);
52
+ expect(await $resource.pick()).toBe(1);
53
53
 
54
54
  $resource.dispose();
55
- expect(() => $resource.pick()).toThrow("[PicoFlow] Primitive is disposed");
55
+ await expect($resource.pick()).rejects.toThrow(
56
+ "[PicoFlow] Primitive is disposed",
57
+ );
56
58
  });
57
59
  });
58
60
 
@@ -66,13 +68,13 @@ describe("effect", () => {
66
68
 
67
69
  const $resource = resource(fetchResource);
68
70
  const effectFn = vi.fn();
69
- effect((t) => effectFn($resource.get(t)));
71
+ effect(async (t) => effectFn(await $resource.get(t)));
70
72
 
71
- expect(effectFn).toHaveBeenCalledTimes(1);
73
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
72
74
  expect(effectFn).toHaveBeenLastCalledWith(undefined);
73
75
 
74
76
  await $resource.fetch();
75
- expect(effectFn).toHaveBeenCalledTimes(2);
77
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
76
78
  expect(effectFn).toHaveBeenLastCalledWith(1);
77
79
 
78
80
  await $resource.fetch();
@@ -87,17 +89,17 @@ describe("effect", () => {
87
89
 
88
90
  const $resource = resource(fetchResource);
89
91
  const effectFn = vi.fn();
90
- effect((t) => effectFn($resource.get(t)));
92
+ effect(async (t) => effectFn(await $resource.get(t)));
91
93
 
92
- expect(effectFn).toHaveBeenCalledTimes(1);
94
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
93
95
  expect(effectFn).toHaveBeenLastCalledWith(undefined);
94
96
 
95
97
  await $resource.fetch();
96
- expect(effectFn).toHaveBeenCalledTimes(2);
98
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
97
99
  expect(effectFn).toHaveBeenLastCalledWith(0);
98
100
 
99
101
  await $resource.fetch();
100
- expect(effectFn).toHaveBeenCalledTimes(2);
102
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
101
103
  expect(effectFn).toHaveBeenLastCalledWith(0);
102
104
  });
103
105
 
@@ -110,18 +112,18 @@ describe("effect", () => {
110
112
 
111
113
  const $resource = resource(fetchResource);
112
114
  const effectFn = vi.fn();
113
- const $effect = effect((t) => effectFn($resource.get(t)));
115
+ const $effect = effect(async (t) => effectFn(await $resource.get(t)));
114
116
 
115
- expect(effectFn).toHaveBeenCalledTimes(1);
117
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
116
118
  expect(effectFn).toHaveBeenLastCalledWith(undefined);
117
119
 
118
120
  await $resource.fetch();
119
- expect(effectFn).toHaveBeenCalledTimes(2);
121
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
120
122
  expect(effectFn).toHaveBeenLastCalledWith(1);
121
123
 
122
124
  $effect.dispose();
123
125
  await $resource.fetch();
124
- expect(effectFn).toHaveBeenCalledTimes(2);
126
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
125
127
  expect(effectFn).toHaveBeenLastCalledWith(1);
126
128
  });
127
129
  });
@@ -52,7 +52,9 @@ describe("resourceAsync", () => {
52
52
  expect(await $resource.pick()).toBe(2);
53
53
 
54
54
  $resource.dispose();
55
- expect(() => $resource.pick()).toThrow("[PicoFlow] Primitive is disposed");
55
+ await expect($resource.pick()).rejects.toThrow(
56
+ "[PicoFlow] Primitive is disposed",
57
+ );
56
58
  });
57
59
  });
58
60
 
@@ -21,13 +21,13 @@ describe("stream", () => {
21
21
  };
22
22
  });
23
23
 
24
- expect($stream.pick()).toBe(undefined);
24
+ expect(await $stream.pick()).toBe(undefined);
25
25
 
26
26
  counter.increment();
27
- expect($stream.pick()).toBe(1);
27
+ expect(await $stream.pick()).toBe(1);
28
28
 
29
29
  counter.increment();
30
- expect($stream.pick()).toBe(2);
30
+ expect(await $stream.pick()).toBe(2);
31
31
  });
32
32
 
33
33
  test("stream is updated (interval)", async () => {
@@ -42,13 +42,13 @@ describe("stream", () => {
42
42
  return () => clearInterval(interval);
43
43
  });
44
44
 
45
- expect($stream.pick()).toBe(undefined);
45
+ expect(await $stream.pick()).toBe(undefined);
46
46
 
47
47
  vi.advanceTimersToNextTimer();
48
- expect($stream.pick()).toBe(1);
48
+ expect(await $stream.pick()).toBe(1);
49
49
 
50
50
  vi.advanceTimersToNextTimer();
51
- expect($stream.pick()).toBe(2);
51
+ expect(await $stream.pick()).toBe(2);
52
52
  });
53
53
 
54
54
  test("get throws when stream is disposed", async () => {
@@ -63,17 +63,19 @@ describe("stream", () => {
63
63
  return () => clearInterval(interval);
64
64
  });
65
65
 
66
- expect($stream.pick()).toBe(undefined);
66
+ expect(await $stream.pick()).toBe(undefined);
67
67
 
68
68
  vi.advanceTimersToNextTimer();
69
- expect($stream.pick()).toBe(1);
69
+ expect(await $stream.pick()).toBe(1);
70
70
 
71
71
  vi.advanceTimersToNextTimer();
72
- expect($stream.pick()).toBe(2);
72
+ expect(await $stream.pick()).toBe(2);
73
73
 
74
74
  $stream.dispose();
75
75
  vi.advanceTimersToNextTimer();
76
- expect(() => $stream.pick()).toThrow("[PicoFlow] Primitive is disposed");
76
+ await expect($stream.pick()).rejects.toThrow(
77
+ "[PicoFlow] Primitive is disposed",
78
+ );
77
79
  });
78
80
  });
79
81
 
@@ -91,17 +93,17 @@ describe("effect", () => {
91
93
  });
92
94
 
93
95
  const effectFn = vi.fn();
94
- effect((t) => effectFn($stream.get(t)));
96
+ effect(async (t) => effectFn(await $stream.get(t)));
95
97
 
96
- expect(effectFn).toHaveBeenCalledTimes(1);
98
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
97
99
  expect(effectFn).toHaveBeenLastCalledWith(undefined);
98
100
 
99
101
  vi.advanceTimersToNextTimer();
100
- expect(effectFn).toHaveBeenCalledTimes(2);
102
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
101
103
  expect(effectFn).toHaveBeenLastCalledWith(1);
102
104
 
103
105
  vi.advanceTimersToNextTimer();
104
- expect(effectFn).toHaveBeenCalledTimes(3);
106
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
105
107
  expect(effectFn).toHaveBeenLastCalledWith(2);
106
108
  });
107
109
 
@@ -116,17 +118,17 @@ describe("effect", () => {
116
118
  });
117
119
 
118
120
  const effectFn = vi.fn();
119
- effect((t) => effectFn($stream.get(t)));
121
+ effect(async (t) => effectFn(await $stream.get(t)));
120
122
 
121
- expect(effectFn).toHaveBeenCalledTimes(1);
123
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
122
124
  expect(effectFn).toHaveBeenLastCalledWith(undefined);
123
125
 
124
126
  vi.advanceTimersToNextTimer();
125
- expect(effectFn).toHaveBeenCalledTimes(2);
127
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
126
128
  expect(effectFn).toHaveBeenLastCalledWith(5);
127
129
 
128
130
  vi.advanceTimersToNextTimer();
129
- expect(effectFn).toHaveBeenCalledTimes(2);
131
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
130
132
  expect(effectFn).toHaveBeenLastCalledWith(5);
131
133
  });
132
134
 
@@ -143,22 +145,22 @@ describe("effect", () => {
143
145
  });
144
146
 
145
147
  const effectFn = vi.fn();
146
- const $effect = effect((t) => effectFn($stream.get(t)));
148
+ const $effect = effect(async (t) => effectFn(await $stream.get(t)));
147
149
 
148
- expect(effectFn).toHaveBeenCalledTimes(1);
150
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
149
151
  expect(effectFn).toHaveBeenLastCalledWith(undefined);
150
152
 
151
153
  vi.advanceTimersToNextTimer();
152
- expect(effectFn).toHaveBeenCalledTimes(2);
154
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
153
155
  expect(effectFn).toHaveBeenLastCalledWith(1);
154
156
 
155
157
  vi.advanceTimersToNextTimer();
156
- expect(effectFn).toHaveBeenCalledTimes(3);
158
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
157
159
  expect(effectFn).toHaveBeenLastCalledWith(2);
158
160
 
159
161
  $effect.dispose();
160
162
  vi.advanceTimersToNextTimer();
161
- expect(effectFn).toHaveBeenCalledTimes(3);
163
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
162
164
  expect(effectFn).toHaveBeenLastCalledWith(2);
163
165
  });
164
166
 
@@ -175,22 +177,22 @@ describe("effect", () => {
175
177
  });
176
178
 
177
179
  const effectFn = vi.fn();
178
- effect((t) => effectFn($stream.get(t)));
180
+ effect(async (t) => effectFn(await $stream.get(t)));
179
181
 
180
- expect(effectFn).toHaveBeenCalledTimes(1);
182
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
181
183
  expect(effectFn).toHaveBeenLastCalledWith(undefined);
182
184
 
183
185
  vi.advanceTimersToNextTimer();
184
- expect(effectFn).toHaveBeenCalledTimes(2);
186
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
185
187
  expect(effectFn).toHaveBeenLastCalledWith(1);
186
188
 
187
189
  vi.advanceTimersToNextTimer();
188
- expect(effectFn).toHaveBeenCalledTimes(3);
190
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
189
191
  expect(effectFn).toHaveBeenLastCalledWith(2);
190
192
 
191
193
  $stream.dispose();
192
194
  vi.advanceTimersToNextTimer();
193
- expect(effectFn).toHaveBeenCalledTimes(3);
195
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
194
196
  expect(effectFn).toHaveBeenLastCalledWith(2);
195
197
  });
196
198
  });
@@ -73,7 +73,9 @@ describe("streamAsync", () => {
73
73
 
74
74
  $stream.dispose();
75
75
  vi.advanceTimersToNextTimer();
76
- expect(() => $stream.pick()).toThrow("[PicoFlow] Primitive is disposed");
76
+ await expect($stream.pick()).rejects.toThrow(
77
+ "[PicoFlow] Primitive is disposed",
78
+ );
77
79
  });
78
80
  });
79
81
 
@@ -93,19 +95,19 @@ describe("effect", () => {
93
95
  const effectFn = vi.fn();
94
96
  effect((t) => effectFn($stream.get(t)));
95
97
 
96
- expect(effectFn).toHaveBeenCalledTimes(1);
98
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
97
99
  expect(effectFn).toHaveBeenLastCalledWith(new Promise(() => {}));
98
100
 
99
101
  vi.advanceTimersToNextTimer();
100
- expect(effectFn).toHaveBeenCalledTimes(2);
102
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
101
103
  expect(await effectFn.mock.calls[1][0]).toEqual(1);
102
104
 
103
105
  vi.advanceTimersToNextTimer();
104
- expect(effectFn).toHaveBeenCalledTimes(3);
106
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
105
107
  expect(await effectFn.mock.calls[2][0]).toEqual(2);
106
108
 
107
109
  vi.advanceTimersToNextTimer();
108
- expect(effectFn).toHaveBeenCalledTimes(4);
110
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(4));
109
111
  expect(await effectFn.mock.calls[3][0]).toEqual(3);
110
112
  });
111
113
 
@@ -122,15 +124,15 @@ describe("effect", () => {
122
124
  const effectFn = vi.fn();
123
125
  effect((t) => effectFn($stream.get(t)));
124
126
 
125
- expect(effectFn).toHaveBeenCalledTimes(1);
127
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(1));
126
128
  expect(effectFn).toHaveBeenLastCalledWith(new Promise(() => {}));
127
129
 
128
130
  vi.advanceTimersToNextTimer();
129
- expect(effectFn).toHaveBeenCalledTimes(2);
131
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
130
132
  expect(await effectFn.mock.calls[1][0]).toEqual(5);
131
133
 
132
134
  vi.advanceTimersToNextTimer();
133
- expect(effectFn).toHaveBeenCalledTimes(2);
135
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
134
136
  expect(await effectFn.mock.calls[1][0]).toEqual(5);
135
137
  });
136
138
 
@@ -150,16 +152,16 @@ describe("effect", () => {
150
152
  const $effect = effect((t) => effectFn($stream.get(t)));
151
153
 
152
154
  vi.advanceTimersToNextTimer();
153
- expect(effectFn).toHaveBeenCalledTimes(2);
155
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
154
156
  expect(await effectFn.mock.calls[1][0]).toEqual(1);
155
157
 
156
158
  vi.advanceTimersToNextTimer();
157
- expect(effectFn).toHaveBeenCalledTimes(3);
159
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
158
160
  expect(await effectFn.mock.calls[2][0]).toEqual(2);
159
161
 
160
162
  $effect.dispose();
161
163
  vi.advanceTimersToNextTimer();
162
- expect(effectFn).toHaveBeenCalledTimes(3);
164
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
163
165
  expect(await effectFn.mock.calls[2][0]).toEqual(2);
164
166
  });
165
167
 
@@ -179,16 +181,16 @@ describe("effect", () => {
179
181
  effect((t) => effectFn($stream.get(t)));
180
182
 
181
183
  vi.advanceTimersToNextTimer();
182
- expect(effectFn).toHaveBeenCalledTimes(2);
184
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(2));
183
185
  expect(await effectFn.mock.calls[1][0]).toEqual(1);
184
186
 
185
187
  vi.advanceTimersToNextTimer();
186
- expect(effectFn).toHaveBeenCalledTimes(3);
188
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
187
189
  expect(await effectFn.mock.calls[2][0]).toEqual(2);
188
190
 
189
191
  $stream.dispose();
190
192
  vi.advanceTimersToNextTimer();
191
- expect(effectFn).toHaveBeenCalledTimes(3);
193
+ await vi.waitFor(() => expect(effectFn).toHaveBeenCalledTimes(3));
192
194
  expect(await effectFn.mock.calls[2][0]).toEqual(2);
193
195
  });
194
196
  });