synstate 3.3.0 → 4.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 (307) hide show
  1. package/README.md +14 -9
  2. package/dist/core/authoring.d.mts +7 -0
  3. package/dist/core/authoring.d.mts.map +1 -0
  4. package/dist/core/authoring.mjs +7 -0
  5. package/dist/core/authoring.mjs.map +1 -0
  6. package/dist/core/class/child-observable-class.d.mts +93 -0
  7. package/dist/core/class/child-observable-class.d.mts.map +1 -0
  8. package/dist/core/class/child-observable-class.mjs +248 -0
  9. package/dist/core/class/child-observable-class.mjs.map +1 -0
  10. package/dist/core/class/create-child-observable.d.mts +159 -0
  11. package/dist/core/class/create-child-observable.d.mts.map +1 -0
  12. package/dist/core/class/create-child-observable.mjs +183 -0
  13. package/dist/core/class/create-child-observable.mjs.map +1 -0
  14. package/dist/core/class/create-root-observable.d.mts +37 -0
  15. package/dist/core/class/create-root-observable.d.mts.map +1 -0
  16. package/dist/core/class/create-root-observable.mjs +52 -0
  17. package/dist/core/class/create-root-observable.mjs.map +1 -0
  18. package/dist/core/class/index.d.mts +9 -0
  19. package/dist/core/class/index.d.mts.map +1 -0
  20. package/dist/core/class/index.mjs +9 -0
  21. package/dist/core/class/index.mjs.map +1 -0
  22. package/dist/core/class/manager-observable-class.d.mts +26 -0
  23. package/dist/core/class/manager-observable-class.d.mts.map +1 -0
  24. package/dist/core/class/manager-observable-class.mjs +116 -0
  25. package/dist/core/class/manager-observable-class.mjs.map +1 -0
  26. package/dist/core/class/observable-base-class.d.mts +97 -0
  27. package/dist/core/class/observable-base-class.d.mts.map +1 -0
  28. package/dist/core/class/observable-base-class.mjs +219 -0
  29. package/dist/core/class/observable-base-class.mjs.map +1 -0
  30. package/dist/core/class/observable-node.d.mts +40 -0
  31. package/dist/core/class/observable-node.d.mts.map +1 -0
  32. package/dist/core/class/observable-node.mjs +10 -0
  33. package/dist/core/class/observable-node.mjs.map +1 -0
  34. package/dist/core/class/propagation-state.d.mts +24 -0
  35. package/dist/core/class/propagation-state.d.mts.map +1 -0
  36. package/dist/core/class/propagation-state.mjs +66 -0
  37. package/dist/core/class/propagation-state.mjs.map +1 -0
  38. package/dist/core/class/root-observable-class.d.mts +23 -0
  39. package/dist/core/class/root-observable-class.d.mts.map +1 -0
  40. package/dist/core/class/root-observable-class.mjs +58 -0
  41. package/dist/core/class/root-observable-class.mjs.map +1 -0
  42. package/dist/core/combine/combine.d.mts.map +1 -1
  43. package/dist/core/combine/combine.mjs +25 -14
  44. package/dist/core/combine/combine.mjs.map +1 -1
  45. package/dist/core/combine/merge.d.mts +0 -3
  46. package/dist/core/combine/merge.d.mts.map +1 -1
  47. package/dist/core/combine/merge.mjs +24 -15
  48. package/dist/core/combine/merge.mjs.map +1 -1
  49. package/dist/core/combine/zip.d.mts +4 -2
  50. package/dist/core/combine/zip.d.mts.map +1 -1
  51. package/dist/core/combine/zip.mjs +54 -18
  52. package/dist/core/combine/zip.mjs.map +1 -1
  53. package/dist/core/create/counter.d.mts +9 -3
  54. package/dist/core/create/counter.d.mts.map +1 -1
  55. package/dist/core/create/counter.mjs +69 -35
  56. package/dist/core/create/counter.mjs.map +1 -1
  57. package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
  58. package/dist/core/create/from-abortable-promise.mjs +26 -18
  59. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  60. package/dist/core/create/from-promise.d.mts.map +1 -1
  61. package/dist/core/create/from-promise.mjs +30 -21
  62. package/dist/core/create/from-promise.mjs.map +1 -1
  63. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  64. package/dist/core/create/from-subscribable.mjs +48 -12
  65. package/dist/core/create/from-subscribable.mjs.map +1 -1
  66. package/dist/core/create/just.d.mts.map +1 -1
  67. package/dist/core/create/just.mjs +4 -2
  68. package/dist/core/create/just.mjs.map +1 -1
  69. package/dist/core/create/source.d.mts +7 -0
  70. package/dist/core/create/source.d.mts.map +1 -1
  71. package/dist/core/create/source.mjs +27 -13
  72. package/dist/core/create/source.mjs.map +1 -1
  73. package/dist/core/create/timer.d.mts.map +1 -1
  74. package/dist/core/create/timer.mjs +40 -25
  75. package/dist/core/create/timer.mjs.map +1 -1
  76. package/dist/core/index.d.mts +2 -0
  77. package/dist/core/index.d.mts.map +1 -1
  78. package/dist/core/index.mjs +2 -0
  79. package/dist/core/index.mjs.map +1 -1
  80. package/dist/core/operators/audit.d.mts +3 -0
  81. package/dist/core/operators/audit.d.mts.map +1 -1
  82. package/dist/core/operators/audit.mjs +56 -28
  83. package/dist/core/operators/audit.mjs.map +1 -1
  84. package/dist/core/operators/debounce.d.mts +3 -0
  85. package/dist/core/operators/debounce.d.mts.map +1 -1
  86. package/dist/core/operators/debounce.mjs +57 -26
  87. package/dist/core/operators/debounce.mjs.map +1 -1
  88. package/dist/core/operators/filter.d.mts.map +1 -1
  89. package/dist/core/operators/filter.mjs +35 -21
  90. package/dist/core/operators/filter.mjs.map +1 -1
  91. package/dist/core/operators/index.d.mts +1 -0
  92. package/dist/core/operators/index.d.mts.map +1 -1
  93. package/dist/core/operators/index.mjs +1 -0
  94. package/dist/core/operators/index.mjs.map +1 -1
  95. package/dist/core/operators/map.d.mts.map +1 -1
  96. package/dist/core/operators/map.mjs +31 -17
  97. package/dist/core/operators/map.mjs.map +1 -1
  98. package/dist/core/operators/merge-map.d.mts +5 -3
  99. package/dist/core/operators/merge-map.d.mts.map +1 -1
  100. package/dist/core/operators/merge-map.mjs +49 -26
  101. package/dist/core/operators/merge-map.mjs.map +1 -1
  102. package/dist/core/operators/pairwise.d.mts.map +1 -1
  103. package/dist/core/operators/pairwise.mjs +31 -20
  104. package/dist/core/operators/pairwise.mjs.map +1 -1
  105. package/dist/core/operators/scan.d.mts.map +1 -1
  106. package/dist/core/operators/scan.mjs +27 -14
  107. package/dist/core/operators/scan.mjs.map +1 -1
  108. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  109. package/dist/core/operators/skip-if-no-change.mjs +33 -19
  110. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  111. package/dist/core/operators/skip-until.d.mts.map +1 -1
  112. package/dist/core/operators/skip-until.mjs +43 -20
  113. package/dist/core/operators/skip-until.mjs.map +1 -1
  114. package/dist/core/operators/skip-while.d.mts.map +1 -1
  115. package/dist/core/operators/skip-while.mjs +35 -20
  116. package/dist/core/operators/skip-while.mjs.map +1 -1
  117. package/dist/core/operators/switch-map.d.mts +5 -3
  118. package/dist/core/operators/switch-map.d.mts.map +1 -1
  119. package/dist/core/operators/switch-map.mjs +53 -25
  120. package/dist/core/operators/switch-map.mjs.map +1 -1
  121. package/dist/core/operators/take-until.d.mts.map +1 -1
  122. package/dist/core/operators/take-until.mjs +38 -19
  123. package/dist/core/operators/take-until.mjs.map +1 -1
  124. package/dist/core/operators/take-while.d.mts.map +1 -1
  125. package/dist/core/operators/take-while.mjs +36 -22
  126. package/dist/core/operators/take-while.mjs.map +1 -1
  127. package/dist/core/{predefined/operators → operators}/take.d.mts +7 -3
  128. package/dist/core/operators/take.d.mts.map +1 -0
  129. package/dist/core/operators/take.mjs +102 -0
  130. package/dist/core/operators/take.mjs.map +1 -0
  131. package/dist/core/operators/throttle.d.mts.map +1 -1
  132. package/dist/core/operators/throttle.mjs +41 -26
  133. package/dist/core/operators/throttle.mjs.map +1 -1
  134. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  135. package/dist/core/operators/with-buffered-from.mjs +44 -31
  136. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  137. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  138. package/dist/core/operators/with-current-value-from.mjs +36 -21
  139. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  140. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  141. package/dist/core/operators/with-initial-value.mjs +24 -12
  142. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  143. package/dist/core/predefined/operators/index.d.mts +0 -1
  144. package/dist/core/predefined/operators/index.d.mts.map +1 -1
  145. package/dist/core/predefined/operators/index.mjs +0 -1
  146. package/dist/core/predefined/operators/index.mjs.map +1 -1
  147. package/dist/core/scope/index.d.mts +2 -0
  148. package/dist/core/scope/index.d.mts.map +1 -0
  149. package/dist/core/scope/index.mjs +2 -0
  150. package/dist/core/scope/index.mjs.map +1 -0
  151. package/dist/core/scope/scope.d.mts +51 -0
  152. package/dist/core/scope/scope.d.mts.map +1 -0
  153. package/dist/core/scope/scope.mjs +194 -0
  154. package/dist/core/scope/scope.mjs.map +1 -0
  155. package/dist/core/types/id.d.mts +0 -2
  156. package/dist/core/types/id.d.mts.map +1 -1
  157. package/dist/core/types/index.d.mts +1 -0
  158. package/dist/core/types/index.d.mts.map +1 -1
  159. package/dist/core/types/index.mjs +1 -0
  160. package/dist/core/types/index.mjs.map +1 -1
  161. package/dist/core/types/observable-family.d.mts +6 -1
  162. package/dist/core/types/observable-family.d.mts.map +1 -1
  163. package/dist/core/types/observable-family.mjs.map +1 -1
  164. package/dist/core/types/observable.d.mts +40 -28
  165. package/dist/core/types/observable.d.mts.map +1 -1
  166. package/dist/core/types/observable.mjs +24 -0
  167. package/dist/core/types/observable.mjs.map +1 -1
  168. package/dist/core/types/scope.d.mts +27 -0
  169. package/dist/core/types/scope.d.mts.map +1 -0
  170. package/dist/core/types/scope.mjs +2 -0
  171. package/dist/core/types/scope.mjs.map +1 -0
  172. package/dist/core/utils/current-scope.d.mts +30 -0
  173. package/dist/core/utils/current-scope.d.mts.map +1 -0
  174. package/dist/core/utils/current-scope.mjs +26 -0
  175. package/dist/core/utils/current-scope.mjs.map +1 -0
  176. package/dist/core/utils/id-maker.d.mts +14 -3
  177. package/dist/core/utils/id-maker.d.mts.map +1 -1
  178. package/dist/core/utils/id-maker.mjs +18 -14
  179. package/dist/core/utils/id-maker.mjs.map +1 -1
  180. package/dist/core/utils/index.d.mts +2 -1
  181. package/dist/core/utils/index.d.mts.map +1 -1
  182. package/dist/core/utils/index.mjs +2 -1
  183. package/dist/core/utils/index.mjs.map +1 -1
  184. package/dist/core/utils/max-depth.d.mts +1 -0
  185. package/dist/core/utils/max-depth.d.mts.map +1 -1
  186. package/dist/core/utils/max-depth.mjs +9 -7
  187. package/dist/core/utils/max-depth.mjs.map +1 -1
  188. package/dist/core/utils/observable-brand.d.mts +13 -0
  189. package/dist/core/utils/observable-brand.d.mts.map +1 -0
  190. package/dist/core/utils/observable-brand.mjs +13 -0
  191. package/dist/core/utils/observable-brand.mjs.map +1 -0
  192. package/dist/utils/create-boolean-state.d.mts +2 -2
  193. package/dist/utils/create-event-emitter.d.mts +2 -2
  194. package/dist/utils/create-reducer.d.mts +17 -8
  195. package/dist/utils/create-reducer.d.mts.map +1 -1
  196. package/dist/utils/create-reducer.mjs +14 -6
  197. package/dist/utils/create-reducer.mjs.map +1 -1
  198. package/dist/utils/create-state.d.mts +9 -2
  199. package/dist/utils/create-state.d.mts.map +1 -1
  200. package/dist/utils/create-state.mjs +7 -0
  201. package/dist/utils/create-state.mjs.map +1 -1
  202. package/package.json +16 -16
  203. package/src/core/authoring.mts +19 -0
  204. package/src/core/class/child-observable-class.mts +374 -0
  205. package/src/core/{base → class}/circular-dependency-comparison.test.mts +46 -38
  206. package/src/core/{base → class}/circular-dependency.test.mts +38 -2
  207. package/src/core/class/complete-propagation.test.mts +264 -0
  208. package/src/core/class/create-child-observable.mts +370 -0
  209. package/src/core/class/create-root-observable.mts +107 -0
  210. package/src/core/class/index.mts +8 -0
  211. package/src/core/class/manager-observable-class.mts +166 -0
  212. package/src/core/class/observable-base-class.mts +315 -0
  213. package/src/core/{base → class}/observable-base.test.mts +1 -1
  214. package/src/core/class/observable-node.mts +54 -0
  215. package/src/core/class/propagation-order.test.mts +92 -0
  216. package/src/core/class/propagation-state.mts +80 -0
  217. package/src/core/class/remove-completed.test.mts +369 -0
  218. package/src/core/class/root-observable-class.mts +85 -0
  219. package/src/core/class/write-during-propagation.test.mts +234 -0
  220. package/src/core/combine/combine.mts +67 -55
  221. package/src/core/combine/merge.mts +33 -26
  222. package/src/core/combine/zip.mts +103 -58
  223. package/src/core/create/counter.mts +105 -54
  224. package/src/core/create/counter.test.mts +82 -0
  225. package/src/core/create/from-abortable-promise.mts +54 -42
  226. package/src/core/create/from-promise.mts +38 -29
  227. package/src/core/create/from-subscribable.mts +68 -23
  228. package/src/core/create/from-subscribable.test.mts +134 -0
  229. package/src/core/create/just.mts +4 -5
  230. package/src/core/create/source.mts +37 -13
  231. package/src/core/create/source.test.mts +41 -0
  232. package/src/core/create/timer.mts +51 -32
  233. package/src/core/index.mts +2 -0
  234. package/src/core/operators/audit.mts +79 -45
  235. package/src/core/operators/debounce-audit-complete.test.mts +121 -0
  236. package/src/core/operators/debounce.mts +81 -40
  237. package/src/core/operators/filter.mts +48 -31
  238. package/src/core/operators/index.mts +1 -0
  239. package/src/core/operators/inner-ownership.test.mts +280 -0
  240. package/src/core/operators/map.mts +49 -32
  241. package/src/core/operators/merge-map.mts +81 -46
  242. package/src/core/operators/pairwise.mts +40 -30
  243. package/src/core/operators/scan.mts +41 -24
  244. package/src/core/operators/skip-if-no-change.mts +45 -31
  245. package/src/core/operators/skip-until.mts +59 -33
  246. package/src/core/operators/skip-while.mts +49 -31
  247. package/src/core/operators/switch-map.mts +74 -38
  248. package/src/core/operators/take-until-skip-until-teardown.test.mts +133 -0
  249. package/src/core/operators/take-until.mts +49 -31
  250. package/src/core/operators/take-while.mts +50 -33
  251. package/src/core/operators/take.mts +138 -0
  252. package/src/core/operators/throttle.mts +55 -38
  253. package/src/core/operators/with-buffered-from.mts +45 -35
  254. package/src/core/operators/with-buffered-from.test.mts +57 -0
  255. package/src/core/operators/with-current-value-from.mts +39 -25
  256. package/src/core/operators/with-initial-value.mts +30 -21
  257. package/src/core/predefined/operators/index.mts +0 -1
  258. package/src/core/scope/index.mts +1 -0
  259. package/src/core/scope/scope.mts +260 -0
  260. package/src/core/scope/scope.test.mts +462 -0
  261. package/src/core/types/id.mts +0 -4
  262. package/src/core/types/index.mts +1 -0
  263. package/src/core/types/observable-family.mts +7 -1
  264. package/src/core/types/observable.mts +77 -42
  265. package/src/core/types/scope.mts +27 -0
  266. package/src/core/utils/current-scope.mts +61 -0
  267. package/src/core/utils/id-maker.mts +20 -30
  268. package/src/core/utils/index.mts +2 -1
  269. package/src/core/utils/max-depth.mts +12 -9
  270. package/src/core/utils/observable-brand.mts +12 -0
  271. package/src/utils/create-boolean-state.mts +2 -2
  272. package/src/utils/create-boolean-state.test.mts +18 -4
  273. package/src/utils/create-event-emitter.mts +2 -2
  274. package/src/utils/create-reducer.mts +22 -16
  275. package/src/utils/create-reducer.test.mts +43 -14
  276. package/src/utils/create-state.mts +9 -2
  277. package/src/utils/create-state.test.mts +32 -14
  278. package/dist/core/base/create-child-observable.d.mts +0 -65
  279. package/dist/core/base/create-child-observable.d.mts.map +0 -1
  280. package/dist/core/base/create-child-observable.mjs +0 -267
  281. package/dist/core/base/create-child-observable.mjs.map +0 -1
  282. package/dist/core/base/create-observable-base.d.mts +0 -147
  283. package/dist/core/base/create-observable-base.d.mts.map +0 -1
  284. package/dist/core/base/create-observable-base.mjs +0 -255
  285. package/dist/core/base/create-observable-base.mjs.map +0 -1
  286. package/dist/core/base/create-root-observable.d.mts +0 -37
  287. package/dist/core/base/create-root-observable.d.mts.map +0 -1
  288. package/dist/core/base/create-root-observable.mjs +0 -57
  289. package/dist/core/base/create-root-observable.mjs.map +0 -1
  290. package/dist/core/base/index.d.mts +0 -3
  291. package/dist/core/base/index.d.mts.map +0 -1
  292. package/dist/core/base/index.mjs +0 -3
  293. package/dist/core/base/index.mjs.map +0 -1
  294. package/dist/core/predefined/operators/take.d.mts.map +0 -1
  295. package/dist/core/predefined/operators/take.mjs +0 -44
  296. package/dist/core/predefined/operators/take.mjs.map +0 -1
  297. package/dist/core/utils/utils.d.mts +0 -6
  298. package/dist/core/utils/utils.d.mts.map +0 -1
  299. package/dist/core/utils/utils.mjs +0 -37
  300. package/dist/core/utils/utils.mjs.map +0 -1
  301. package/src/core/base/create-child-observable.mts +0 -457
  302. package/src/core/base/create-observable-base.mts +0 -548
  303. package/src/core/base/create-root-observable.mts +0 -113
  304. package/src/core/base/index.mts +0 -2
  305. package/src/core/predefined/operators/take.mts +0 -48
  306. package/src/core/utils/utils.mts +0 -56
  307. package/src/core/utils/utils.test.mts +0 -88
@@ -1,6 +1,7 @@
1
1
  import { type Optional, type Some } from 'ts-data-forge';
2
2
  import type { StrictOmit } from 'ts-type-forge';
3
- import type { ObservableId, UpdateToken } from './id.mjs';
3
+ import { observableBrand } from '../utils/index.mjs';
4
+ import type { UpdateToken } from './id.mjs';
4
5
  import type { ObservableKind } from './observable-kind.mjs';
5
6
  import type { NonEmptyUnknownList, Subscription } from './types.mjs';
6
7
  /**
@@ -17,35 +18,31 @@ import type { NonEmptyUnknownList, Subscription } from './types.mjs';
17
18
  * ```
18
19
  */
19
20
  type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
20
- id: ObservableId;
21
+ [observableBrand]: true;
21
22
  kind: Kind;
23
+ /**
24
+ * One more than the deepest observable this one is derived from; 0 for a
25
+ * root. An update reaches observables in ascending depth, so every parent
26
+ * has emitted before its child reads it.
27
+ */
22
28
  depth: Kind extends 'root' ? 0 : number;
23
- addChild: <B>(child: ChildObservable<B>) => void;
24
- deleteChild: <B>(child: ChildObservable<B>) => void;
25
29
  getSnapshot: () => Optional<A>;
26
30
  isCompleted: boolean;
27
- updateToken: UpdateToken;
28
- hasSubscriber: boolean;
29
- hasChild: boolean;
30
- hasActiveChild: () => boolean;
31
31
  /**
32
- * Whether this observable completes itself once nothing uses it any more —
33
- * once it has neither subscribers nor live children when one of its children
34
- * completes. True when completing it would release something: it has a
35
- * teardown of its own (a timer, an inner subscription) or a parent with
36
- * `autoComplete`. A `source` or `createState` and everything derived from
37
- * it alone are never completed this way, so completing a derived observable
38
- * cannot end a state that something else may still read (#2133).
32
+ * The token of the update in which this observable last emitted. A child's
33
+ * `tryUpdate` receives the token of the update now propagating; a parent
34
+ * whose token differs did not emit in it. The token is opaque: compare it,
35
+ * store it, or pass it on to `setNext`.
39
36
  */
40
- autoComplete: boolean;
41
- tryUpdate: (updateToken: UpdateToken) => void;
42
- tryComplete: () => void;
37
+ updateToken: UpdateToken;
43
38
  complete: () => void;
44
39
  /**
45
- * Completes this observable and takes it out of the graph, without telling
46
- * its parents: unlike `complete()`, it never completes an upstream
47
- * observable, whatever its `autoComplete`. Its descendants are completed as
48
- * by `complete()` once none of their parents is live.
40
+ * Completes this observable and takes it out of the graph, for whoever owns
41
+ * it (a scope) to release it. Neither this nor `complete()` reaches upstream:
42
+ * a child completing never completes its parents, which may be shared
43
+ * (#2133). Its descendants complete once none of their parents is live.
44
+ * Unlike `complete()`, it passes on nothing the observable still holds: a
45
+ * `debounce` or `audit` drops its pending value instead of emitting it.
49
46
  */
50
47
  dispose: () => void;
51
48
  subscribe: (onNext: (v: A) => void, onComplete?: () => void) => Subscription;
@@ -64,18 +61,14 @@ declare namespace ObservableTypeConverter {
64
61
  export type ToChild<A, O extends CreateObservableType<A, ObservableKind>, P extends NonEmptyUnknownList = NonEmptyUnknownList> = O & Readonly<{
65
62
  parents: Wrap<P>;
66
63
  }>;
67
- export type ToManager<A, O extends CreateObservableType<A, 'async child' | 'root'>> = O & Readonly<{
68
- addDescendant: <B>(child: ChildObservable<B>) => void;
69
- deleteDescendant: <B>(child: ChildObservable<B>) => void;
70
- }>;
71
64
  export {};
72
65
  }
73
66
  export type SyncChildObservable<A, P extends NonEmptyUnknownList = NonEmptyUnknownList> = ObservableTypeConverter.ToChild<A, CreateObservableType<A, 'sync child'>, P>;
74
67
  export type InitializedSyncChildObservable<A, P extends NonEmptyUnknownList = NonEmptyUnknownList> = ObservableTypeConverter.ToInitialized<A, SyncChildObservable<A, P>>;
75
- export type AsyncChildObservable<A, P extends NonEmptyUnknownList = NonEmptyUnknownList> = ObservableTypeConverter.ToManager<A, ObservableTypeConverter.ToChild<A, CreateObservableType<A, 'async child'>, P>>;
68
+ export type AsyncChildObservable<A, P extends NonEmptyUnknownList = NonEmptyUnknownList> = ObservableTypeConverter.ToChild<A, CreateObservableType<A, 'async child'>, P>;
76
69
  export type InitializedAsyncChildObservable<A, P extends NonEmptyUnknownList = NonEmptyUnknownList> = ObservableTypeConverter.ToInitialized<A, AsyncChildObservable<A, P>>;
77
70
  export type ChildObservable<A, P extends NonEmptyUnknownList = NonEmptyUnknownList> = AsyncChildObservable<A, P> | SyncChildObservable<A, P>;
78
- export type RootObservable<A> = ObservableTypeConverter.ToManager<A, CreateObservableType<A, 'root'>>;
71
+ export type RootObservable<A> = CreateObservableType<A, 'root'>;
79
72
  export type InitializedRootObservable<A> = ObservableTypeConverter.ToInitialized<A, RootObservable<A>>;
80
73
  export type Observable<A> = AsyncChildObservable<A> | RootObservable<A> | SyncChildObservable<A>;
81
74
  export type InitializedObservable<A> = InitializedAsyncChildObservable<A> | InitializedRootObservable<A> | InitializedSyncChildObservable<A>;
@@ -87,6 +80,25 @@ export type DropInitialValueOperator<A, B> = (src: InitializedObservable<A> | Ob
87
80
  /** Type of operator that preserves whether Observable has initial value */
88
81
  export type KeepInitialValueOperator<A, B> = (src: InitializedObservable<A>) => InitializedObservable<B>;
89
82
  export type Operator<A, B> = WithInitialValueOperator<A, B> | DropInitialValueOperator<A, B> | KeepInitialValueOperator<A, B>;
83
+ /**
84
+ * Tells an observable made by synstate from any other value, by the brand
85
+ * every observable carries. Checking for a `subscribe` method instead would
86
+ * also accept plain values that happen to have one.
87
+ *
88
+ * @example
89
+ *
90
+ * ```ts
91
+ * const [count$] = createState(0);
92
+ *
93
+ * assert.isTrue(isObservable(count$));
94
+ *
95
+ * // A `subscribe` method alone does not make an observable.
96
+ * assert.isFalse(isObservable({ subscribe: () => {} }));
97
+ *
98
+ * assert.isFalse(isObservable(0));
99
+ * ```
100
+ */
101
+ export declare const isObservable: (value: unknown) => value is Observable<unknown>;
90
102
  export declare const isManagerObservable: <A>(obs: Observable<A>) => obs is ManagerObservable<A>;
91
103
  export declare const isRootObservable: <A>(obs: Observable<A>) => obs is RootObservable<A>;
92
104
  export declare const isChildObservable: <A>(obs: Observable<A>) => obs is ChildObservable<A>;
@@ -1 +1 @@
1
- {"version":3,"file":"observable.d.mts","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErE;;;;;;;;;;;;GAYG;AAEH,KAAK,oBAAoB,CAAC,CAAC,EAAE,IAAI,SAAS,cAAc,IAAI,QAAQ,CAAC;IACnE,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IAGX,KAAK,EAAE,IAAI,SAAS,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAGpD,WAAW,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,OAAO,CAAC;IAE9B;;;;;;;;OAQG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAC;IAErB;;;;;OAKG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,KAAK,YAAY,CAAC;IAE7E,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACrB,CAAC,CAAC;AAEH,gBAAgB;AAChB,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EACtB,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,KACrC,qBAAqB,CAAC,CAAC,CAAC,CAAC,GAC5B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAChE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnE,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAExE,gBAAgB;AAChB,kBAAU,uBAAuB,CAAC;IAChC,MAAM,MAAM,aAAa,CACvB,CAAC,EACD,CAAC,SAAS,oBAAoB,CAAC,CAAC,EAAE,cAAc,CAAC,IAC/C,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,GACvC,QAAQ,CAAC;QACP,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;KACnC,CAAC,CAAC;IAEL,KAAK,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EACpC,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,KACrC,qBAAqB,CAAC,CAAC,CAAC,CAAC,GAC5B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAChE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,MAAM,MAAM,OAAO,CACjB,CAAC,EACD,CAAC,SAAS,oBAAoB,CAAC,CAAC,EAAE,cAAc,CAAC,EACjD,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IACjD,CAAC,GACH,QAAQ,CAAC;QACP,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;KAClB,CAAC,CAAC;IAEL,MAAM,MAAM,SAAS,CACnB,CAAC,EACD,CAAC,SAAS,oBAAoB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC,IACvD,CAAC,GACH,QAAQ,CAAC;QACP,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACtD,gBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;KAC1D,CAAC,CAAC;;CACN;AAED,MAAM,MAAM,mBAAmB,CAC7B,CAAC,EACD,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IACjD,uBAAuB,CAAC,OAAO,CACjC,CAAC,EACD,oBAAoB,CAAC,CAAC,EAAE,YAAY,CAAC,EACrC,CAAC,CACF,CAAC;AAEF,MAAM,MAAM,8BAA8B,CACxC,CAAC,EACD,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IACjD,uBAAuB,CAAC,aAAa,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAExE,MAAM,MAAM,oBAAoB,CAC9B,CAAC,EACD,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IACjD,uBAAuB,CAAC,SAAS,CACnC,CAAC,EACD,uBAAuB,CAAC,OAAO,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAC9E,CAAC;AAEF,MAAM,MAAM,+BAA+B,CACzC,CAAC,EACD,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IACjD,uBAAuB,CAAC,aAAa,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,MAAM,eAAe,CACzB,CAAC,EACD,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IACjD,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3D,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,uBAAuB,CAAC,SAAS,CAC/D,CAAC,EACD,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,CAAC,IACrC,uBAAuB,CAAC,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,MAAM,MAAM,UAAU,CAAC,CAAC,IACtB,oBAAoB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAEvE,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAC/B,+BAA+B,CAAC,CAAC,CAAC,GAClC,yBAAyB,CAAC,CAAC,CAAC,GAC5B,8BAA8B,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;AAI/E,yEAAyE;AACzE,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAC3C,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,KACf,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAE9B,8EAA8E;AAC9E,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAC3C,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,KAC1C,UAAU,CAAC,CAAC,CAAC,CAAC;AAEnB,2EAA2E;AAC3E,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAC3C,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAC1B,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAE9B,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,IACrB,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC9B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC9B,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnC,eAAO,MAAM,mBAAmB,GAAI,CAAC,OAC9B,UAAU,CAAC,CAAC,CAAC,KACjB,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAA8B,CAAC;AAE5D,eAAO,MAAM,gBAAgB,GAAI,CAAC,OAC3B,UAAU,CAAC,CAAC,CAAC,KACjB,GAAG,IAAI,cAAc,CAAC,CAAC,CAAwB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,GAAI,CAAC,OAC5B,UAAU,CAAC,CAAC,CAAC,KACjB,GAAG,IAAI,eAAe,CAAC,CAAC,CAC8B,CAAC;AAE1D,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE3E,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;KACrE,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,QAAQ,CAAC;KACvD,CAAC,IAAI,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,QAAQ,CAAC;KAClE,CAAC,IAAI,MAAM,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5C,CAAC,CAAC"}
1
+ {"version":3,"file":"observable.d.mts","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"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"}
@@ -1,4 +1,24 @@
1
+ import { hasKey, isRecord, } from 'ts-data-forge';
2
+ import { observableBrand } from '../utils/index.mjs';
1
3
 
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+ export const isObservable = (value) => isRecord(value) && hasKey(value, observableBrand);
2
22
  export const isManagerObservable = (obs) => obs.kind !== 'sync child';
3
23
  export const isRootObservable = (obs) => obs.kind === 'root';
4
24
  export const isChildObservable = (obs) => obs.kind === 'sync child' || obs.kind === 'async child';
@@ -18,4 +38,8 @@ export const isChildObservable = (obs) => obs.kind === 'sync child' || obs.kind
18
38
 
19
39
 
20
40
 
41
+
42
+
43
+
44
+
21
45
  //# sourceMappingURL=observable.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"observable.mjs","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,MAAM,eAAe,CAAC;AAsLrE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,GAAkB,EACW,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAkB,EACQ,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,GAAkB,EACS,EAAE,CAC7B,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC;AAgB1D,sEAAsE;AACtE,uDAAuD;AAEvD,UAAU,CAAuD,IAAI,CAAC,CAAC;AAEvE,UAAU,CAAiD,IAAI,CAAC,CAAC;AAEjE,UAAU,CAAsC,GAAG,CAAC,CAAC;AAErD,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAAgD,GAAG,CAAC,CAAC;AAE/D,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAA2C,GAAG,CAAC,CAAC;AAE1D,UAAU,CAAuD,GAAG,CAAC,CAAC;AAEtE,UAAU,CAA8C,IAAI,CAAC,CAAC;AAE9D,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAGR,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"observable.mjs","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,MAAM,EACN,QAAQ,GAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAqKrD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAgC,EAAE,CAC3E,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,GAAkB,EACW,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAkB,EACQ,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,GAAkB,EACS,EAAE,CAC7B,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC;AAgB1D,sEAAsE;AACtE,uDAAuD;AAEvD,oEAAoE;AACpE,+CAA+C;AAC/C,UAAU,CAYR,GAAG,CAAC,CAAC;AAEP,UAAU,CAGR,GAAG,CAAC,CAAC;AAEP,oEAAoE;AACpE,UAAU,CAGR,KAAK,CAAC,CAAC;AAET,UAAU,CAAsC,GAAG,CAAC,CAAC;AAErD,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAAgD,GAAG,CAAC,CAAC;AAE/D,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAA2C,GAAG,CAAC,CAAC;AAE1D,UAAU,CAAuD,GAAG,CAAC,CAAC;AAEtE,UAAU,CAA8C,IAAI,CAAC,CAAC;AAE9D,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAGR,KAAK,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A unit of ownership: the observables created while {@link Scope.run} is
3
+ * running belong to the scope, and {@link Scope.dispose} releases them all at
4
+ * once. Create one with `createScope`.
5
+ *
6
+ * For authors of libraries built on synstate (a UI binding mounts and unmounts
7
+ * by scope); application code that defines its state at module level does not
8
+ * need it.
9
+ */
10
+ export type Scope = Readonly<{
11
+ /**
12
+ * Calls `body` with this scope as the current one and returns what it
13
+ * returns. Only what `body` creates synchronously joins the scope: by the time
14
+ * code after an `await` or in a callback runs, `run` has already returned.
15
+ *
16
+ * On a disposed scope it warns, still calls `body`, and nothing created there
17
+ * belongs to any scope.
18
+ */
19
+ run: <R>(body: () => R) => R;
20
+ /**
21
+ * Disposes the child scopes (newest first), calls the functions registered
22
+ * with `onScopeDispose` (newest first), disposes the owned observables
23
+ * (newest first) and leaves the parent scope. Calling it again does nothing.
24
+ */
25
+ dispose: () => void;
26
+ }>;
27
+ //# sourceMappingURL=scope.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.mts","sourceRoot":"","sources":["../../../src/core/types/scope.mts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B;;;;;;;OAOG;IACH,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7B;;;;OAIG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scope.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.mjs","sourceRoot":"","sources":["../../../src/core/types/scope.mts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import type { Scope } from '../types/index.mjs';
2
+ /** What a scope owns: an observable, as far as the scope needs to know it. */
3
+ export type ScopeMember = Readonly<{
4
+ isCompleted: boolean;
5
+ dispose: () => void;
6
+ }>;
7
+ /**
8
+ * The side of a scope the rest of the core talks to, on top of its public
9
+ * face {@link Scope}. Kept out of the public API (`core/utils/**` is excluded
10
+ * from index generation), so that only `createScope` and its siblings decide
11
+ * what a scope owns.
12
+ */
13
+ export type ScopeInternals = Scope & Readonly<{
14
+ /** Takes `node` into the scope. */
15
+ adopt: (node: ScopeMember) => void;
16
+ /**
17
+ * Tells the scope that one of the nodes it adopted completed on its own,
18
+ * so that the scope can drop it and keep no reference to it. The node is
19
+ * completed (`isCompleted`) by the time it calls this.
20
+ */
21
+ release: () => void;
22
+ addCleanup: (cleanup: () => void) => void;
23
+ }>;
24
+ export declare const getCurrentScopeInternals: () => ScopeInternals | undefined;
25
+ /**
26
+ * Calls `body` with `scope` as the current scope (`undefined`: none) and
27
+ * restores the previous one afterwards, also when `body` throws.
28
+ */
29
+ export declare const runWithScope: <R>(scope: ScopeInternals | undefined, body: () => R) => R;
30
+ //# sourceMappingURL=current-scope.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-scope.d.mts","sourceRoot":"","sources":["../../../src/core/utils/current-scope.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,8EAA8E;AAC9E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAChC,QAAQ,CAAC;IACP,mCAAmC;IACnC,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAEnC;;;;OAIG;IACH,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAC3C,CAAC,CAAC;AAUL,eAAO,MAAM,wBAAwB,QAAO,cAAc,GAAG,SAC3C,CAAC;AAEnB;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SACrB,cAAc,GAAG,SAAS,QAC3B,MAAM,CAAC,KACZ,CAaF,CAAC"}
@@ -0,0 +1,26 @@
1
+
2
+
3
+
4
+
5
+ const mut_slot = {
6
+ current: undefined,
7
+ };
8
+ export const getCurrentScopeInternals = () => mut_slot.current;
9
+
10
+
11
+
12
+
13
+ export const runWithScope = (scope, body) => {
14
+ const prev = mut_slot.current;
15
+ mut_slot.current = scope;
16
+
17
+
18
+
19
+ try {
20
+ return body();
21
+ }
22
+ finally {
23
+ mut_slot.current = prev;
24
+ }
25
+ };
26
+ //# sourceMappingURL=current-scope.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-scope.mjs","sourceRoot":"","sources":["../../../src/core/utils/current-scope.mts"],"names":[],"mappings":"AA6BA;;;GAGG;AACH,MAAM,QAAQ,GAA4C;IACxD,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAA+B,EAAE,CACvE,QAAQ,CAAC,OAAO,CAAC;AAEnB;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAiC,EACjC,IAAa,EACV,EAAE;IACL,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;IAE9B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,4EAA4E;IAC5E,qDAAqD;IACrD,uCAAuC;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC"}
@@ -1,5 +1,16 @@
1
- import type { ObservableId, SubscriberId, UpdateToken } from '../types/index.mjs';
2
- export declare const issueObservableId: () => ObservableId;
3
- export declare const issueSubscriberId: () => SubscriberId;
1
+ import type { UpdateToken } from '../types/index.mjs';
2
+ /**
3
+ * The token of a new update, which the update's root or async child passes to
4
+ * every node it reaches. A `Symbol` with no description, issued once per
5
+ * update and never per node, so its cost is spread over every node the
6
+ * update reaches. Unique without any counter, so the tokens of two copies of
7
+ * synstate in one program never coincide, and nothing is kept in a global.
8
+ */
4
9
  export declare const issueUpdateToken: () => UpdateToken;
10
+ /**
11
+ * The token a node holds before its first update: one value shared by every
12
+ * node of this copy, since no update is ever issued it, so creating a node
13
+ * issues nothing.
14
+ */
15
+ export declare const notUpdatedYet: UpdateToken;
5
16
  //# sourceMappingURL=id-maker.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"id-maker.d.mts","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAmB5B,eAAO,MAAM,iBAAiB,QAAO,YACL,CAAC;AAEjC,eAAO,MAAM,iBAAiB,QAAO,YACL,CAAC;AAEjC,eAAO,MAAM,gBAAgB,QAAO,WACL,CAAC"}
1
+ {"version":3,"file":"id-maker.d.mts","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,QAAO,WAEX,CAAC;AAE1B;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,WAEuB,CAAC"}
@@ -1,15 +1,19 @@
1
- function* idMaker() {
2
- let mut_i = 0;
3
- while (true) {
4
-
5
- yield Symbol(mut_i.toString());
6
- mut_i += 1;
7
- }
8
- }
9
- const observableIdMaker = idMaker();
10
- const subscriberIdMaker = idMaker();
11
- const updateTokenMaker = idMaker();
12
- export const issueObservableId = () => observableIdMaker.next().value;
13
- export const issueSubscriberId = () => subscriberIdMaker.next().value;
14
- export const issueUpdateToken = () => updateTokenMaker.next().value;
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+ export const issueUpdateToken = () =>
9
+
10
+ Symbol();
11
+
12
+
13
+
14
+
15
+
16
+ export const notUpdatedYet =
17
+
18
+ Symbol('synstate/not-updated-yet');
15
19
  //# sourceMappingURL=id-maker.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"id-maker.mjs","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAMA,QAAQ,CAAC,CAAC,OAAO;IACf,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,IAAI,EAAE,CAAC;QACZ,4DAA4D;QAC5D,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAM,CAAC;QAEpC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,OAAO,EAAgB,CAAC;AAElD,MAAM,iBAAiB,GAAG,OAAO,EAAgB,CAAC;AAElD,MAAM,gBAAgB,GAAG,OAAO,EAAe,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAiB,EAAE,CAClD,iBAAiB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAiB,EAAE,CAClD,iBAAiB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAEjC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAgB,EAAE,CAChD,gBAAgB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC"}
1
+ {"version":3,"file":"id-maker.mjs","sourceRoot":"","sources":["../../../src/core/utils/id-maker.mts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAgB,EAAE;AAChD,4DAA4D;AAC5D,MAAM,EAAiB,CAAC;AAE1B;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa;AACxB,4DAA4D;AAC5D,MAAM,CAAC,0BAA0B,CAAgB,CAAC"}
@@ -1,5 +1,6 @@
1
+ export * from './current-scope.mjs';
1
2
  export * from './id-maker.mjs';
2
3
  export * from './max-depth.mjs';
4
+ export * from './observable-brand.mjs';
3
5
  export * from './observable-utils.mjs';
4
- export * from './utils.mjs';
5
6
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/utils/index.mts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/utils/index.mts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
@@ -1,5 +1,6 @@
1
+ export * from './current-scope.mjs';
1
2
  export * from './id-maker.mjs';
2
3
  export * from './max-depth.mjs';
4
+ export * from './observable-brand.mjs';
3
5
  export * from './observable-utils.mjs';
4
- export * from './utils.mjs';
5
6
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/utils/index.mts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/utils/index.mts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { Observable } from '../types/index.mjs';
2
+ /** The greatest `depth` among `parents`, or 0 when there are none. */
2
3
  export declare const maxDepth: (parents: readonly Observable<unknown>[]) => number;
3
4
  //# sourceMappingURL=max-depth.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"max-depth.d.mts","sourceRoot":"","sources":["../../../src/core/utils/max-depth.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,eAAO,MAAM,QAAQ,YAAa,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,KAAG,MAO/B,CAAC"}
1
+ {"version":3,"file":"max-depth.d.mts","sourceRoot":"","sources":["../../../src/core/utils/max-depth.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,sEAAsE;AACtE,eAAO,MAAM,QAAQ,YAAa,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,KAAG,MAUlE,CAAC"}
@@ -1,9 +1,11 @@
1
- import { Arr, Optional, pipe } from 'ts-data-forge';
2
- export const maxDepth = (parents) => pipe(Arr.maxBy(parents, (p) => p.depth))
3
1
 
4
-
5
-
6
-
7
- .mapOptional((o) => o.depth)
8
- .map(Optional.unwrapOr(0)).value;
2
+ export const maxDepth = (parents) => {
3
+ let mut_max = 0;
4
+ for (const p of parents) {
5
+ if (p.depth > mut_max) {
6
+ mut_max = p.depth;
7
+ }
8
+ }
9
+ return mut_max;
10
+ };
9
11
  //# sourceMappingURL=max-depth.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"max-depth.mjs","sourceRoot":"","sources":["../../../src/core/utils/max-depth.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAuC,EAAU,EAAE,CAC1E,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACtC,0EAA0E;IAC1E,mEAAmE;IACnE,kEAAkE;IAClE,sBAAsB;KACrB,WAAW,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;KACnC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC"}
1
+ {"version":3,"file":"max-depth.mjs","sourceRoot":"","sources":["../../../src/core/utils/max-depth.mts"],"names":[],"mappings":"AAEA,sEAAsE;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAuC,EAAU,EAAE;IAC1E,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The key every observable carries, set to `true` by `assembleObservable`. It
3
+ * lets `isObservable` tell an observable from any other value at run time —
4
+ * a `subscribe` method is not enough, since plain values may have one — and,
5
+ * as a type, makes the public observable types impossible to satisfy with an
6
+ * object literal: an imitation passed to an operator would lack the internal
7
+ * members propagation reads and fail at run time instead of at compile time.
8
+ *
9
+ * `Symbol.for`, so that an observable made by another copy of synstate in the
10
+ * same program is still recognized.
11
+ */
12
+ export declare const observableBrand: unique symbol;
13
+ //# sourceMappingURL=observable-brand.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable-brand.d.mts","sourceRoot":"","sources":["../../../src/core/utils/observable-brand.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,MAA0C,CAAC"}
@@ -0,0 +1,13 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+ export const observableBrand = Symbol.for('synstate/observable');
13
+ //# sourceMappingURL=observable-brand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable-brand.mjs","sourceRoot":"","sources":["../../../src/core/utils/observable-brand.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkB,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC"}
@@ -5,8 +5,8 @@ import type { StateOptions } from './create-reducer.mjs';
5
5
  * Extends `createState` with boolean-specific helpers like `toggle`, `setTrue`, and `setFalse`.
6
6
  *
7
7
  * @param initialState - The initial boolean value
8
- * @param options - {@link StateOptions}: `equals`, to pass on only the
9
- * updates that change the state
8
+ * @param options - {@link StateOptions}: `equals` (default `Object.is`),
9
+ * to pass on only the updates that change the state
10
10
  * @returns A 2-element tuple: `[state, { setTrue, setFalse, toggle, setState, updateState, resetState, getSnapshot, initialState }]`
11
11
  *
12
12
  * @example
@@ -17,13 +17,13 @@ import { type Observable } from '../core/index.mjs';
17
17
  *
18
18
  * emitClick(); // logs: Clicked!
19
19
  *
20
- * assert.deepStrictEqual(mut_clickCount.value, 1);
20
+ * assert.strictEqual(mut_clickCount.value, 1);
21
21
  *
22
22
  * emitClick();
23
23
  *
24
24
  * emitClick();
25
25
  *
26
- * assert.deepStrictEqual(mut_clickCount.value, 3);
26
+ * assert.strictEqual(mut_clickCount.value, 3);
27
27
  * ```
28
28
  */
29
29
  export declare const createEventEmitter: () => readonly [Observable<void>, () => void];
@@ -8,9 +8,11 @@ import { type InitializedObservable } from '../core/index.mjs';
8
8
  * @template A - The type of actions
9
9
  * @param reducer - A pure function that takes current state and action, returns new state
10
10
  * @param initialState - The initial value of the state
11
- * @param options - {@link StateOptions}: `equals`, to pass on only the
12
- * dispatches that change the state
13
- * @returns A 3-element tuple: `[state, dispatch, { getSnapshot, initialState }]`
11
+ * @param options - {@link StateOptions}: `equals` (default `Object.is`),
12
+ * to pass on only the dispatches that change the state
13
+ * @returns A 3-element tuple: `[state, dispatch, { getSnapshot, initialState }]`.
14
+ * `dispatch` returns the state it leaves; once `state` is completed, that
15
+ * is the state held.
14
16
  *
15
17
  * @example
16
18
  * ```ts
@@ -51,7 +53,7 @@ import { type InitializedObservable } from '../core/index.mjs';
51
53
  * (s, action: Readonly<{ type: 'add'; amount: number }>) =>
52
54
  * s + action.amount,
53
55
  * 0,
54
- * { equals: Object.is },
56
+ * { equals: () => false },
55
57
  * );
56
58
  *
57
59
  * const countHistory: number[] = [];
@@ -60,12 +62,19 @@ import { type InitializedObservable } from '../core/index.mjs';
60
62
  * countHistory.push(value);
61
63
  * });
62
64
  *
63
- * dispatch({ type: 'add', amount: 0 }); // 0 again: nothing is passed on
65
+ * dispatch({ type: 'add', amount: 0 }); // 0 again, passed on all the same
64
66
  *
65
67
  * dispatch({ type: 'add', amount: 2 });
66
68
  *
67
- * assert.deepStrictEqual(countHistory, [0, 2]);
69
+ * assert.deepStrictEqual(countHistory, [0, 0, 2]);
68
70
  * ```
71
+ *
72
+ * @note Do not call `dispatch` from a subscriber or a projection while another
73
+ * update is propagating: the write propagates immediately, so subscribers can
74
+ * see an intermediate state, and it logs a `console.warn` (once per
75
+ * observable). Derive the value from its source instead —
76
+ * `const b$ = a$.pipe(map((a) => a * 2))` rather than
77
+ * `a$.subscribe((a) => { setB(a * 2); })`.
69
78
  */
70
79
  export declare const createReducer: <S, A>(reducer: Reducer<S, A>, initialState: S, options?: StateOptions<NoInfer<S>>) => readonly [state: InitializedObservable<S>, dispatch: (action: A) => S, utils: Readonly<{
71
80
  getSnapshot: () => S;
@@ -86,8 +95,8 @@ export type StateOptions<S> = Readonly<{
86
95
  * `skipIfNoChange`: an update passed on here reaches whatever reads the
87
96
  * state directly before any operator can thin it out.
88
97
  *
89
- * When omitted, every update is passed on, equal or not. That default is
90
- * stocked in `NEXT_MAJOR.md` to become `Object.is`.
98
+ * Defaults to `Object.is`, so writing the value already held passes
99
+ * nothing on. Pass `() => false` to pass on every update, equal or not.
91
100
  *
92
101
  * @param current - The state held now
93
102
  * @param next - The state the update would set
@@ -1 +1 @@
1
- {"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAU,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,WACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,gBACR,CAAC,YACL,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KACjC,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,QAAQ,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAuBH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC;IACrC;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;CAC3C,CAAC,CAAC"}
1
+ {"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAU,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,WACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,gBACR,CAAC,YACL,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KACjC,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,QAAQ,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAoBH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC;IACrC;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;CAC3C,CAAC,CAAC"}
@@ -56,6 +56,15 @@ import { source } from '../core/index.mjs';
56
56
 
57
57
 
58
58
 
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
59
68
 
60
69
 
61
70
 
@@ -68,15 +77,14 @@ import { source } from '../core/index.mjs';
68
77
 
69
78
  export const createReducer = (reducer, initialState, options) => {
70
79
  const state = source(initialState);
71
- const equals = options?.equals;
80
+ const equals = options?.equals ?? Object.is;
72
81
  const dispatch = (action) => {
73
82
  const currentState = state.getSnapshot().value;
74
83
  const nextState = reducer(currentState, action);
75
- if (equals?.(currentState, nextState) === true) {
76
- return currentState;
77
- }
78
- state.next(nextState);
79
- return nextState;
84
+
85
+ return equals(currentState, nextState)
86
+ ? currentState
87
+ : state.next(nextState);
80
88
  };
81
89
  const getSnapshot = () => state.getSnapshot().value;
82
90
  return [state, dispatch, { getSnapshot, initialState }];
@@ -1 +1 @@
1
- {"version":3,"file":"create-reducer.mjs","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA8B,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAsB,EACtB,YAAe,EACf,OAAkC,EAQlC,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAE/B,MAAM,QAAQ,GAAG,CAAC,MAAS,EAAK,EAAE;QAChC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;QAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAEhD,IAAI,MAAM,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtB,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;IAEvD,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAU,CAAC;AACnE,CAAC,CAAC"}
1
+ {"version":3,"file":"create-reducer.mjs","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA8B,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAsB,EACtB,YAAe,EACf,OAAkC,EAQlC,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAAG,CAAC,MAAS,EAAK,EAAE;QAChC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;QAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAEhD,8DAA8D;QAC9D,OAAO,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC;YACpC,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;IAEvD,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAU,CAAC;AACnE,CAAC,CAAC"}
@@ -6,8 +6,8 @@ import { type StateOptions } from './create-reducer.mjs';
6
6
  *
7
7
  * @template S - The type of the state
8
8
  * @param initialState - The initial value of the state
9
- * @param options - {@link StateOptions}: `equals`, to pass on only the
10
- * updates that change the state
9
+ * @param options - {@link StateOptions}: `equals` (default `Object.is`),
10
+ * to pass on only the updates that change the state
11
11
  * @returns A 3-element tuple: `[state, setState, { updateState, resetState, getSnapshot, initialState }]`
12
12
  *
13
13
  * @example
@@ -66,6 +66,13 @@ import { type StateOptions } from './create-reducer.mjs';
66
66
  * 'label:bug page:2',
67
67
  * ]);
68
68
  * ```
69
+ *
70
+ * @note Do not call `setState`, `updateState` or `resetState` from a subscriber or a projection while another
71
+ * update is propagating: the write propagates immediately, so subscribers can
72
+ * see an intermediate state, and it logs a `console.warn` (once per
73
+ * observable). Derive the value from its source instead —
74
+ * `const b$ = a$.pipe(map((a) => a * 2))` rather than
75
+ * `a$.subscribe((a) => { setB(a * 2); })`.
69
76
  */
70
77
  export declare const createState: <S>(initialState: S, options?: StateOptions<NoInfer<S>>) => readonly [state: InitializedObservable<S>, setState: (v: S) => S, utils: Readonly<{
71
78
  updateState: (updateFn: (prev: S) => S) => S;