@raphy-js/raph 1.0.0-dev.2 → 1.0.1-dev.25

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 (246) hide show
  1. package/README.md +1096 -0
  2. package/dist/api/Raph.d.ts +59 -190
  3. package/dist/api/RaphFacadeSession.d.ts +90 -0
  4. package/dist/api/RaphReactivityInstance.d.ts +72 -0
  5. package/dist/api/errors.d.ts +9 -4
  6. package/dist/api/types.d.ts +162 -17
  7. package/dist/core-CClhT8WR.js +1044 -0
  8. package/dist/core-cPQWYD4K.cjs +1 -0
  9. package/dist/debug/api/Raph.cjs +1 -1
  10. package/dist/debug/api/Raph.js +368 -367
  11. package/dist/debug/api/RaphFacadeSession.cjs +1 -0
  12. package/dist/debug/api/RaphFacadeSession.js +302 -0
  13. package/dist/debug/api/RaphReactivityInstance.cjs +1 -0
  14. package/dist/debug/api/RaphReactivityInstance.js +146 -0
  15. package/dist/debug/api/errors.cjs +1 -1
  16. package/dist/debug/api/errors.js +10 -7
  17. package/dist/debug/path/DataPath.cjs +1 -0
  18. package/dist/debug/path/DataPath.js +390 -0
  19. package/dist/debug/path/PathRouter.cjs +1 -0
  20. package/dist/debug/path/PathRouter.js +80 -0
  21. package/dist/debug/path/RaphKernel.cjs +1 -1
  22. package/dist/debug/path/RaphKernel.js +316 -236
  23. package/dist/debug/path/data-path.utils.cjs +1 -0
  24. package/dist/debug/path/data-path.utils.js +56 -0
  25. package/dist/debug/path/derived/DerivedRegistry.cjs +1 -0
  26. package/dist/debug/path/derived/DerivedRegistry.js +143 -0
  27. package/dist/debug/path/derived/RaphDerivedHandle.cjs +1 -0
  28. package/dist/debug/path/{RaphDerivedHandle.js → derived/RaphDerivedHandle.js} +19 -22
  29. package/dist/debug/path/derived/derived-collection.utils.cjs +1 -0
  30. package/dist/debug/path/{derived-collection.js → derived/derived-collection.utils.js} +71 -71
  31. package/dist/debug/path/derived/derived-strategy.types.cjs +1 -0
  32. package/dist/debug/path/derived/derived-strategy.types.js +1 -0
  33. package/dist/debug/path/meta/MetaController.cjs +1 -0
  34. package/dist/debug/path/{MetaController.js → meta/MetaController.js} +58 -66
  35. package/dist/debug/path/meta/RaphMeta.cjs +1 -0
  36. package/dist/debug/path/meta/RaphMeta.js +62 -0
  37. package/dist/debug/path/meta/RaphMetaStore.cjs +1 -0
  38. package/dist/debug/path/{RaphMetaStore.js → meta/RaphMetaStore.js} +24 -30
  39. package/dist/debug/path/meta/meta.types.cjs +1 -0
  40. package/dist/debug/path/meta/meta.types.js +1 -0
  41. package/dist/debug/path/storage/AdapterPathStore.cjs +1 -0
  42. package/dist/debug/path/storage/AdapterPathStore.js +128 -0
  43. package/dist/debug/path/storage/DefaultDataAdapter.cjs +1 -0
  44. package/dist/debug/path/{data-adapter.js → storage/DefaultDataAdapter.js} +47 -57
  45. package/dist/debug/path/storage/PathEventHub.cjs +1 -0
  46. package/dist/debug/path/storage/PathEventHub.js +161 -0
  47. package/dist/debug/path/storage/PathStore.cjs +1 -0
  48. package/dist/debug/path/{PathStore.js → storage/PathStore.js} +88 -98
  49. package/dist/debug/path/storage/createDataDraft.cjs +1 -0
  50. package/dist/debug/path/{data-draft.js → storage/createDataDraft.js} +24 -28
  51. package/dist/debug/path/storage/data-adapter.types.cjs +1 -0
  52. package/dist/debug/path/storage/data-adapter.types.js +1 -0
  53. package/dist/debug/reactivity/disposal.cjs +1 -0
  54. package/dist/debug/reactivity/disposal.js +32 -0
  55. package/dist/debug/reactivity/engine.cjs +1 -1
  56. package/dist/debug/reactivity/engine.js +888 -321
  57. package/dist/debug/reactivity/reactive-object.cjs +1 -0
  58. package/dist/debug/reactivity/reactive-object.js +265 -0
  59. package/dist/debug/reactivity/scope.cjs +1 -1
  60. package/dist/debug/reactivity/scope.js +221 -117
  61. package/dist/debug/reactivity/watch.cjs +1 -1
  62. package/dist/debug/reactivity/watch.js +1 -1
  63. package/dist/debug/runtime/RaphRuntime.cjs +1 -1
  64. package/dist/debug/runtime/RaphRuntime.js +1134 -502
  65. package/dist/debug/runtime/diagnostics/RaphDebug.cjs +1 -0
  66. package/dist/debug/runtime/diagnostics/RaphDebug.js +287 -0
  67. package/dist/debug/runtime/errors.cjs +1 -1
  68. package/dist/debug/runtime/errors.js +6 -3
  69. package/dist/debug/runtime/ownership/RaphEffectScope.cjs +1 -0
  70. package/dist/debug/runtime/ownership/RaphEffectScope.js +304 -0
  71. package/dist/debug/runtime/ownership/RaphNode.cjs +1 -0
  72. package/dist/debug/runtime/ownership/RaphNode.js +665 -0
  73. package/dist/debug/runtime/ownership/RaphScope.cjs +1 -0
  74. package/dist/debug/runtime/ownership/RaphScope.js +236 -0
  75. package/dist/debug/runtime/ownership/parent-graph.types.cjs +1 -0
  76. package/dist/debug/runtime/ownership/parent-graph.types.js +1 -0
  77. package/dist/debug/runtime/phases/RaphFrameLoop.cjs +1 -0
  78. package/dist/debug/runtime/{RaphFrameLoop.js → phases/RaphFrameLoop.js} +13 -17
  79. package/dist/debug/runtime/phases/RaphPhasePipeline.cjs +1 -0
  80. package/dist/debug/runtime/phases/RaphPhasePipeline.js +848 -0
  81. package/dist/debug/runtime/phases/RaphPhaseTaskRecord.cjs +1 -0
  82. package/dist/debug/runtime/phases/RaphPhaseTaskRecord.js +176 -0
  83. package/dist/debug/runtime/phases/RaphPhaseWatch.cjs +1 -0
  84. package/dist/debug/runtime/phases/RaphPhaseWatch.js +20 -0
  85. package/dist/debug/runtime/phases/orderPhaseTasks.cjs +1 -0
  86. package/dist/debug/runtime/phases/orderPhaseTasks.js +59 -0
  87. package/dist/debug/runtime/reactivity/PathHandle.cjs +1 -0
  88. package/dist/debug/runtime/reactivity/PathHandle.js +165 -0
  89. package/dist/debug/runtime/reactivity/RaphMetaSource.cjs +1 -0
  90. package/dist/debug/runtime/reactivity/RaphMetaSource.js +108 -0
  91. package/dist/debug/runtime/reactivity/RaphSelector.cjs +1 -0
  92. package/dist/debug/runtime/reactivity/RaphSelector.js +503 -0
  93. package/dist/debug/runtime/reactivity/RaphWorkGraph.cjs +1 -0
  94. package/dist/debug/runtime/reactivity/RaphWorkGraph.js +1157 -0
  95. package/dist/debug/runtime/reactivity/RuntimeReactivity.cjs +1 -0
  96. package/dist/debug/runtime/reactivity/RuntimeReactivity.js +550 -0
  97. package/dist/debug/runtime/reactivity/RuntimeWatch.cjs +1 -0
  98. package/dist/debug/runtime/reactivity/RuntimeWatch.js +77 -0
  99. package/dist/debug/runtime/reactivity/disposal-sweep.utils.cjs +1 -0
  100. package/dist/debug/runtime/reactivity/disposal-sweep.utils.js +42 -0
  101. package/dist/debug/runtime/reactivity/runtime-reactivity.types.cjs +1 -0
  102. package/dist/debug/runtime/reactivity/runtime-reactivity.types.js +1 -0
  103. package/dist/entrypoints/machine-testing.d.ts +2 -0
  104. package/dist/entrypoints/machine.d.ts +5 -0
  105. package/dist/entrypoints/path.d.ts +14 -0
  106. package/dist/entrypoints/reactivity.d.ts +1 -0
  107. package/dist/entrypoints/runtime.d.ts +18 -0
  108. package/dist/index.cjs +1 -1
  109. package/dist/index.js +46 -38
  110. package/dist/machine/compiler.d.ts +71 -0
  111. package/dist/machine/core.d.ts +50 -0
  112. package/dist/machine/persistence.d.ts +5 -0
  113. package/dist/machine/runtime.d.ts +4 -0
  114. package/dist/machine/testing.d.ts +43 -0
  115. package/dist/machine/types.d.ts +155 -0
  116. package/dist/machine-testing.cjs +1 -0
  117. package/dist/machine-testing.js +188 -0
  118. package/dist/machine.cjs +1 -0
  119. package/dist/machine.js +822 -0
  120. package/dist/main.d.ts +20 -0
  121. package/dist/path/{data-path.d.ts → DataPath.d.ts} +16 -40
  122. package/dist/path/{path-router.d.ts → PathRouter.d.ts} +1 -1
  123. package/dist/path/RaphKernel.d.ts +37 -10
  124. package/dist/path/data-path.types.d.ts +34 -0
  125. package/dist/path/data-path.utils.d.ts +9 -0
  126. package/dist/path/{DerivedRegistry.d.ts → derived/DerivedRegistry.d.ts} +2 -2
  127. package/dist/path/{RaphDerivedHandle.d.ts → derived/RaphDerivedHandle.d.ts} +3 -3
  128. package/dist/path/derived/derived-collection.types.d.ts +12 -0
  129. package/dist/path/{derived-collection.d.ts → derived/derived-collection.utils.d.ts} +3 -13
  130. package/dist/path/{derived-strategies.d.ts → derived/derived-strategy.types.d.ts} +0 -3
  131. package/dist/path/derived/derived-strategy.utils.d.ts +4 -0
  132. package/dist/path/{MetaController.d.ts → meta/MetaController.d.ts} +4 -4
  133. package/dist/path/{RaphMeta.d.ts → meta/RaphMeta.d.ts} +2 -2
  134. package/dist/path/{RaphMetaStore.d.ts → meta/RaphMetaStore.d.ts} +1 -1
  135. package/dist/path/{meta.types.d.ts → meta/meta.types.d.ts} +2 -4
  136. package/dist/path/path.types.d.ts +3 -2
  137. package/dist/path/{segment-key.d.ts → pathSegmentKey.d.ts} +1 -1
  138. package/dist/path/{AdapterPathStore.d.ts → storage/AdapterPathStore.d.ts} +4 -4
  139. package/dist/path/{data-adapter.d.ts → storage/DefaultDataAdapter.d.ts} +2 -17
  140. package/dist/path/storage/PathEventHub.d.ts +62 -0
  141. package/dist/path/{PathStore.d.ts → storage/PathStore.d.ts} +7 -7
  142. package/dist/path/storage/data-adapter.types.d.ts +17 -0
  143. package/dist/path.cjs +1 -1
  144. package/dist/path.js +16 -16
  145. package/dist/raph.cjs +1 -1
  146. package/dist/raph.js +46 -38
  147. package/dist/reactivity/disposal.d.ts +14 -0
  148. package/dist/reactivity/engine.d.ts +193 -6
  149. package/dist/reactivity/reactive-object.d.ts +36 -0
  150. package/dist/reactivity/scope.d.ts +108 -30
  151. package/dist/reactivity/types.d.ts +25 -0
  152. package/dist/reactivity.cjs +1 -1
  153. package/dist/reactivity.js +12 -12
  154. package/dist/runtime/RaphRuntime.d.ts +319 -160
  155. package/dist/runtime/diagnostics/RaphDebug.d.ts +239 -0
  156. package/dist/runtime/errors.d.ts +5 -0
  157. package/dist/runtime/ownership/RaphEffectScope.d.ts +98 -0
  158. package/dist/runtime/ownership/RaphNode.d.ts +310 -0
  159. package/dist/runtime/ownership/RaphScope.d.ts +168 -0
  160. package/dist/runtime/{parent-graph.d.ts → ownership/parent-graph.types.d.ts} +0 -1
  161. package/dist/runtime/ownership/parentGraph.d.ts +3 -0
  162. package/dist/runtime/phases/RaphPhasePipeline.d.ts +253 -0
  163. package/dist/runtime/phases/RaphPhaseTaskRecord.d.ts +195 -0
  164. package/dist/runtime/phases/RaphPhaseWatch.d.ts +22 -0
  165. package/dist/runtime/phases/orderPhaseTasks.d.ts +6 -0
  166. package/dist/runtime/phases/phase.types.d.ts +171 -0
  167. package/dist/runtime/{PathHandle.d.ts → reactivity/PathHandle.d.ts} +14 -6
  168. package/dist/runtime/reactivity/RaphMetaSource.d.ts +32 -0
  169. package/dist/runtime/reactivity/RaphSelector.d.ts +338 -0
  170. package/dist/runtime/reactivity/RaphWorkGraph.d.ts +309 -0
  171. package/dist/runtime/reactivity/RuntimeReactivity.d.ts +293 -0
  172. package/dist/runtime/{RuntimeWatch.d.ts → reactivity/RuntimeWatch.d.ts} +12 -6
  173. package/dist/runtime/reactivity/disposal-sweep.utils.d.ts +19 -0
  174. package/dist/runtime/reactivity/runtime-reactivity.types.d.ts +56 -0
  175. package/dist/runtime.cjs +1 -1
  176. package/dist/runtime.js +21 -16
  177. package/package.json +76 -35
  178. package/ReadMe.md +0 -153
  179. package/dist/api/public.d.ts +0 -22
  180. package/dist/debug/api/public.cjs +0 -1
  181. package/dist/debug/api/public.js +0 -40
  182. package/dist/debug/path/AdapterPathStore.cjs +0 -1
  183. package/dist/debug/path/AdapterPathStore.js +0 -133
  184. package/dist/debug/path/DerivedRegistry.cjs +0 -1
  185. package/dist/debug/path/DerivedRegistry.js +0 -157
  186. package/dist/debug/path/MetaController.cjs +0 -1
  187. package/dist/debug/path/PathEventHub.cjs +0 -1
  188. package/dist/debug/path/PathEventHub.js +0 -148
  189. package/dist/debug/path/PathStore.cjs +0 -1
  190. package/dist/debug/path/RaphDerivedHandle.cjs +0 -1
  191. package/dist/debug/path/RaphMeta.cjs +0 -1
  192. package/dist/debug/path/RaphMeta.js +0 -68
  193. package/dist/debug/path/RaphMetaStore.cjs +0 -1
  194. package/dist/debug/path/data-adapter.cjs +0 -1
  195. package/dist/debug/path/data-draft.cjs +0 -1
  196. package/dist/debug/path/data-path.cjs +0 -1
  197. package/dist/debug/path/data-path.js +0 -423
  198. package/dist/debug/path/derived-collection.cjs +0 -1
  199. package/dist/debug/path/path-router.cjs +0 -1
  200. package/dist/debug/path/path-router.js +0 -86
  201. package/dist/debug/path/public.cjs +0 -1
  202. package/dist/debug/path/public.js +0 -18
  203. package/dist/debug/runtime/PathHandle.cjs +0 -1
  204. package/dist/debug/runtime/PathHandle.js +0 -139
  205. package/dist/debug/runtime/RaphDebug.cjs +0 -1
  206. package/dist/debug/runtime/RaphDebug.js +0 -15
  207. package/dist/debug/runtime/RaphFrameLoop.cjs +0 -1
  208. package/dist/debug/runtime/RaphNode.cjs +0 -1
  209. package/dist/debug/runtime/RaphNode.js +0 -143
  210. package/dist/debug/runtime/RaphPhasePipeline.cjs +0 -1
  211. package/dist/debug/runtime/RaphPhasePipeline.js +0 -526
  212. package/dist/debug/runtime/RaphScope.cjs +0 -1
  213. package/dist/debug/runtime/RaphScope.js +0 -64
  214. package/dist/debug/runtime/RuntimeReactivity.cjs +0 -1
  215. package/dist/debug/runtime/RuntimeReactivity.js +0 -154
  216. package/dist/debug/runtime/RuntimeWatch.cjs +0 -1
  217. package/dist/debug/runtime/RuntimeWatch.js +0 -71
  218. package/dist/debug/runtime/public.cjs +0 -1
  219. package/dist/debug/runtime/public.js +0 -18
  220. package/dist/path/PathEventHub.d.ts +0 -48
  221. package/dist/path/public.d.ts +0 -14
  222. package/dist/runtime/RaphDebug.d.ts +0 -32
  223. package/dist/runtime/RaphNode.d.ts +0 -68
  224. package/dist/runtime/RaphPhasePipeline.d.ts +0 -133
  225. package/dist/runtime/RaphScope.d.ts +0 -50
  226. package/dist/runtime/RuntimeReactivity.d.ts +0 -40
  227. package/dist/runtime/phase.types.d.ts +0 -49
  228. package/dist/runtime/public.d.ts +0 -13
  229. package/dist/runtime/runtime-reactivity.types.d.ts +0 -9
  230. /package/dist/debug/path/{meta.types.cjs → data-path.types.cjs} +0 -0
  231. /package/dist/debug/path/{meta.types.js → data-path.types.js} +0 -0
  232. /package/dist/debug/{runtime/runtime-reactivity.types.cjs → path/derived/derived-collection.types.cjs} +0 -0
  233. /package/dist/debug/{runtime/runtime-reactivity.types.js → path/derived/derived-collection.types.js} +0 -0
  234. /package/dist/debug/path/{derived-strategies.cjs → derived/derived-strategy.utils.cjs} +0 -0
  235. /package/dist/debug/path/{derived-strategies.js → derived/derived-strategy.utils.js} +0 -0
  236. /package/dist/debug/path/{segment-key.cjs → pathSegmentKey.cjs} +0 -0
  237. /package/dist/debug/path/{segment-key.js → pathSegmentKey.js} +0 -0
  238. /package/dist/debug/runtime/{parent-graph.cjs → ownership/parentGraph.cjs} +0 -0
  239. /package/dist/debug/runtime/{parent-graph.js → ownership/parentGraph.js} +0 -0
  240. /package/dist/debug/runtime/{disposal.cjs → ownership/throwDisposalErrors.cjs} +0 -0
  241. /package/dist/debug/runtime/{disposal.js → ownership/throwDisposalErrors.js} +0 -0
  242. /package/dist/debug/runtime/{phase.types.cjs → phases/phase.types.cjs} +0 -0
  243. /package/dist/debug/runtime/{phase.types.js → phases/phase.types.js} +0 -0
  244. /package/dist/path/{data-draft.d.ts → storage/createDataDraft.d.ts} +0 -0
  245. /package/dist/runtime/{disposal.d.ts → ownership/throwDisposalErrors.d.ts} +0 -0
  246. /package/dist/runtime/{RaphFrameLoop.d.ts → phases/RaphFrameLoop.d.ts} +0 -0
@@ -0,0 +1,503 @@
1
+ class f {
2
+ /**
3
+ * Создаёт selector и подключает его к записям source. Регистрацию у
4
+ * владельца и проверку аргументов выполняет вызывающий код.
5
+ */
6
+ constructor(e, s, t, r) {
7
+ this.select = g(this), this._previousSource = void 0, this._trackedKey = void 0, this._owner = e, this._reactivity = s, this._source = t, this._equals = r, this._dense = [], this._denseBase = 0, this._denseCount = 0, this._triggers = void 0, this._scanning = !1, this._objectHooks = a(this, t), this._growthLimit = 1, this._sweptAt = 0, this._sweepStride = 0, this._disposed = !1, this._tapSlot = -1, this._sweepSlot = -1, this._sweepDue = 0, t._addWriteTap(this);
8
+ }
9
+ /**
10
+ * Тег Object.prototype.toString: инструменты, которые обходят только plain
11
+ * objects, принимают selector за неделимое значение и не идут через него в
12
+ * граф Runtime.
13
+ */
14
+ get [Symbol.toStringTag]() {
15
+ return "RaphSelector";
16
+ }
17
+ /**
18
+ * Возвращает компактное описание вместо собственных полей: они ведут к
19
+ * владельцу, Runtime и графу зависимостей.
20
+ */
21
+ toJSON() {
22
+ return {
23
+ owner: this._owner.id,
24
+ triggers: this._size(),
25
+ disposed: this._disposed
26
+ };
27
+ }
28
+ /**
29
+ * Владелец selector как наблюдателя записей source.
30
+ * @internal
31
+ */
32
+ get _tapOwner() {
33
+ return this._owner;
34
+ }
35
+ /**
36
+ * Число ключей в индексе triggers: с потребителями и ещё не убранных.
37
+ * @internal
38
+ */
39
+ _debugTriggerCount() {
40
+ return this._size();
41
+ }
42
+ /**
43
+ * Отвечает, совпадает ли ключ с текущим значением source, и подписывает
44
+ * активного потребителя на trigger этого ключа. Чтение проверяется как
45
+ * чтение signal владельца selector: тот же lifetime, тот же запрет чужого
46
+ * Runtime и то же правило implicit-зависимостей.
47
+ *
48
+ * Подписка идёт раньше сравнения: потребитель, у которого чтение source или
49
+ * сравнение бросило исключение, всё равно будет разбужен следующей записью.
50
+ * @internal
51
+ */
52
+ _test(e) {
53
+ const s = this._owner, t = this._reactivity;
54
+ t._assertTrackedRead(s), s._assertAlive(), this._track(e, t);
55
+ const r = this._source.peek(), i = this._equals;
56
+ return i !== void 0 ? i(e, r) : e === r || typeof e == "number" && typeof r == "number" && Object.is(e, r);
57
+ }
58
+ /**
59
+ * Сообщает, что запись в source может разбудить потребителей selector.
60
+ * @internal
61
+ */
62
+ _observesWrites() {
63
+ return this._size() !== 0;
64
+ }
65
+ /**
66
+ * Будит потребителей ключей, чей ответ изменила запись в source. Вызывается
67
+ * signal-ом после того, как новое значение стало видимым, внутри его границы
68
+ * записи. Сбой одного пробуждения не отменяет остальные.
69
+ * @internal
70
+ */
71
+ _afterSourceWrite(e, s) {
72
+ if (this._size() === 0)
73
+ return;
74
+ const t = this._reactivity, r = this._equals;
75
+ if (r === void 0) {
76
+ if (Object.is(e, s))
77
+ return;
78
+ this._wakePair(e, s, t);
79
+ return;
80
+ }
81
+ let i;
82
+ const n = this._scanning;
83
+ this._scanning = !0;
84
+ const o = this._dense;
85
+ for (let _ = 0; _ < o.length; _++) {
86
+ const d = o[_];
87
+ if (d !== void 0) {
88
+ if (!t._signalNodeHasSubscribers(d)) {
89
+ o[_] = void 0, this._denseCount--;
90
+ continue;
91
+ }
92
+ i = this._wakeChanged(
93
+ this._denseBase + _,
94
+ d,
95
+ e,
96
+ s,
97
+ r,
98
+ i
99
+ );
100
+ }
101
+ }
102
+ const h = this._triggers;
103
+ if (h !== void 0)
104
+ for (const [_, d] of h) {
105
+ if (!t._signalNodeHasSubscribers(d)) {
106
+ h.delete(_);
107
+ continue;
108
+ }
109
+ i = this._wakeChanged(_, d, e, s, r, i);
110
+ }
111
+ if (this._scanning = n, this._settleDense(), i !== void 0)
112
+ throw i.length === 1 ? i[0] : new AggregateError(i, "[Raph] Selector notification failed.");
113
+ }
114
+ /**
115
+ * Убирает triggers без потребителей, когда Runtime после прошлой уборки
116
+ * освободил не меньше владельцев, чем ключей в индексе: при массовом
117
+ * освобождении потребителей индекс пустеет одной уборкой на последнем из
118
+ * них. Вызов до срока стоит одного сравнения.
119
+ *
120
+ * Уборка, которая ничего не убрала, удваивает срок следующей: владельцы,
121
+ * освобождённые за это время, не держали потребителей selector, и чем дольше
122
+ * так продолжается, тем реже selector проверяет индекс. Первая же уборка,
123
+ * которая что-то убрала, возвращает прежний срок. Опустевший selector
124
+ * выходит из уборки Runtime и вернётся в неё с первым новым trigger.
125
+ * @internal
126
+ */
127
+ _afterOwnerDisposals(e) {
128
+ const s = this._size(), t = this._sweepStride, r = this._sweptAt + (t > s ? t : s);
129
+ if (e < r)
130
+ return r;
131
+ this._sweep(e);
132
+ const i = this._size();
133
+ if (i === 0)
134
+ return this._sweepStride = 0, this._growthLimit = 1, 0;
135
+ if (i !== s)
136
+ return this._sweepStride = 0, e + i;
137
+ const n = (t > i ? t : i) * 2;
138
+ return this._sweepStride = n, e + n;
139
+ }
140
+ /**
141
+ * Обрабатывает снятие одной связи графа с trigger ключа-объекта. Engine
142
+ * вызывает cleanup связи до того, как вынет её из списка потребителей:
143
+ * связь, оставшаяся в списке единственной, и есть снимаемая, и вместе с ней
144
+ * ключ теряет последнего потребителя. Запись графа при этом не
145
+ * освобождается: её список потребителей в этот момент обходит engine, а без
146
+ * потребителей и без ссылки из индекса она недостижима.
147
+ * @internal
148
+ */
149
+ _edgeDetached(e) {
150
+ if (this._disposed)
151
+ return;
152
+ const s = this._triggers, t = s.get(e);
153
+ t !== void 0 && this._reactivity._hasSingleSubscriber(t) && s.delete(e);
154
+ }
155
+ /**
156
+ * Ищет среди потребителей всех triggers первого, чьего владельца принимает
157
+ * accept, и возвращает этого владельца: implicit-рёбра selector лежат только
158
+ * в графе, как и рёбра Runtime signal.
159
+ * @internal
160
+ */
161
+ _findConsumerOwner(e, s) {
162
+ const t = this._reactivity, r = this._dense;
163
+ for (let n = 0; n < r.length; n++) {
164
+ const o = r[n];
165
+ if (o === void 0)
166
+ continue;
167
+ const h = t._findSubscriberOwner(o, e, s);
168
+ if (h !== void 0)
169
+ return h;
170
+ }
171
+ const i = this._triggers;
172
+ if (i !== void 0)
173
+ for (const n of i.values()) {
174
+ const o = t._findSubscriberOwner(n, e, s);
175
+ if (o !== void 0)
176
+ return o;
177
+ }
178
+ }
179
+ /**
180
+ * Освобождает selector как источник владельца: отключает его от записей
181
+ * source и от уборки Runtime и отсоединяет оставшихся потребителей от всех
182
+ * triggers. Сбой одного шага не отменяет остальные. Повторный вызов
183
+ * безопасен.
184
+ * @internal
185
+ */
186
+ _finalizeSource() {
187
+ if (this._disposed)
188
+ return !0;
189
+ this._disposed = !0, this._equals = void 0, this._source._removeWriteTap(this), this._sweepSlot !== -1 && this._owner.runtime._removeDisposalSweeper(this);
190
+ const e = this._reactivity;
191
+ let s;
192
+ const t = this._dense;
193
+ for (let i = 0; i < t.length; i++) {
194
+ const n = t[i];
195
+ if (n !== void 0)
196
+ try {
197
+ e._releaseSignalNode(n);
198
+ } catch (o) {
199
+ (s ??= []).push(o);
200
+ }
201
+ }
202
+ t.length = 0, this._denseCount = 0;
203
+ const r = this._triggers;
204
+ if (r !== void 0) {
205
+ for (const i of r.values())
206
+ try {
207
+ e._releaseSignalNode(i);
208
+ } catch (n) {
209
+ (s ??= []).push(n);
210
+ }
211
+ r.clear();
212
+ }
213
+ if (s !== void 0)
214
+ throw s.length === 1 ? s[0] : new AggregateError(s, "[Raph] Selector disposal failed.");
215
+ return !0;
216
+ }
217
+ /**
218
+ * Убирает из индекса triggers без потребителей и запоминает, сколько
219
+ * владельцев Runtime освободил к этому моменту. Индекс, в котором
220
+ * потребителей не осталось ни у кого, очищается целиком.
221
+ * @internal
222
+ */
223
+ _sweep(e = this._owner.runtime._ownerDisposalCount()) {
224
+ this._sweptAt = e;
225
+ const s = this._size();
226
+ if (s === 0)
227
+ return;
228
+ const t = this._dense, r = this._triggers, i = this._reactivity, n = i._countObserved(t, r);
229
+ if (n === s) {
230
+ t.length !== this._denseCount && this._settleDense();
231
+ return;
232
+ }
233
+ if (n === 0) {
234
+ t.length = 0, this._denseCount = 0, r !== void 0 && r.clear();
235
+ return;
236
+ }
237
+ this._denseCount = i._dropUnobserved(t, r), this._settleDense();
238
+ }
239
+ /**
240
+ * Число ключей в обеих частях индекса: с потребителями и ещё не убранных.
241
+ */
242
+ _size() {
243
+ const e = this._triggers;
244
+ return e === void 0 ? this._denseCount : this._denseCount + e.size;
245
+ }
246
+ /**
247
+ * Подписывает активного потребителя на trigger ключа; без потребителя ничего
248
+ * не создаёт. Trigger появляется первым отслеживаемым чтением ключа.
249
+ */
250
+ _track(e, s) {
251
+ if (typeof e == "number") {
252
+ const n = this._dense, o = n.length;
253
+ if (o === 0) {
254
+ if (Number.isInteger(e)) {
255
+ this._trackDense(e, 0, s);
256
+ return;
257
+ }
258
+ } else {
259
+ const h = this._denseBase, _ = e - h;
260
+ if (_ >= 0 && _ <= o && _ === (_ | 0) && h + _ === e) {
261
+ const d = _ < o ? n[_] : void 0;
262
+ d !== void 0 ? s._readSignalNode(d) : this._trackDense(e, _, s);
263
+ return;
264
+ }
265
+ }
266
+ }
267
+ const t = this._triggers, r = t === void 0 ? void 0 : t.get(e);
268
+ if (typeof e == "object" ? e !== null : typeof e == "function") {
269
+ this._trackObject(e, r, s);
270
+ return;
271
+ }
272
+ if (r !== void 0) {
273
+ s._readSignalNode(r);
274
+ return;
275
+ }
276
+ const i = s._trackCounterNode(this._source);
277
+ i !== void 0 && (t === void 0 ? this._triggers = (/* @__PURE__ */ new Map()).set(e, i) : t.set(e, i), this._size() >= this._growthLimit && this._grow());
278
+ }
279
+ /**
280
+ * Создаёт trigger целого ключа на месте `offset` ряда: в конце ряда либо на
281
+ * месте, чей прежний trigger убран. Без активного потребителя ничего не
282
+ * создаёт, и пустой ряд остаётся пустым.
283
+ */
284
+ _trackDense(e, s, t) {
285
+ const r = this._triggers;
286
+ if (r !== void 0 && r.size !== 0) {
287
+ const o = r.get(e);
288
+ if (o !== void 0) {
289
+ t._readSignalNode(o);
290
+ return;
291
+ }
292
+ }
293
+ const i = t._trackCounterNode(this._source);
294
+ if (i === void 0)
295
+ return;
296
+ const n = this._dense;
297
+ s === n.length ? (s === 0 && (this._denseBase = e + 0), n.push(i)) : n[s] = i, this._denseCount++, this._size() >= this._growthLimit && this._grow();
298
+ }
299
+ /**
300
+ * Подписывает активного потребителя на trigger ключа-объекта: связь с ним
301
+ * получает cleanup, который помнит ключ.
302
+ */
303
+ _trackObject(e, s, t) {
304
+ if (this._trackedKey = e, s !== void 0)
305
+ t._readSignalNode(s);
306
+ else {
307
+ const r = t._trackCounterNode(this._objectHooks);
308
+ if (r !== void 0) {
309
+ const i = this._triggers;
310
+ i === void 0 ? this._triggers = (/* @__PURE__ */ new Map()).set(e, r) : i.set(e, r), this._size() >= this._growthLimit && this._grow();
311
+ }
312
+ }
313
+ this._trackedKey = void 0;
314
+ }
315
+ /**
316
+ * Убирает triggers без потребителей, когда индекс вырос вдвое после прошлой
317
+ * уборки, и назначает следующий порог роста: цена уборок остаётся
318
+ * постоянной на один новый trigger. С первым trigger подключает selector к
319
+ * уборке Runtime после освобождения владельцев.
320
+ */
321
+ _grow() {
322
+ const e = this._owner.runtime, s = e._ownerDisposalCount();
323
+ this._sweep(s);
324
+ const t = this._size();
325
+ this._growthLimit = t * 2 > 32 ? t * 2 : 32, this._sweepSlot === -1 && (this._sweepStride = 0, e._addDisposalSweeper(this, s + t));
326
+ }
327
+ /**
328
+ * Будит потребителей прежнего и нового значения source при сравнении
329
+ * SameValueZero: ответ изменился только у этих двух ключей. Trigger нового
330
+ * значения ищется после пробуждения прежнего, которое могло изменить индекс.
331
+ */
332
+ _wakePair(e, s, t) {
333
+ let r = !1, i;
334
+ const n = this._find(e);
335
+ if (n !== void 0)
336
+ try {
337
+ this._bump(e, n, t);
338
+ } catch (h) {
339
+ r = !0, i = h;
340
+ }
341
+ const o = this._find(s);
342
+ if (o !== void 0)
343
+ try {
344
+ this._bump(s, o, t);
345
+ } catch (h) {
346
+ throw r ? new AggregateError([i, h], "[Raph] Selector notification failed.") : h;
347
+ }
348
+ if (r)
349
+ throw i;
350
+ }
351
+ /**
352
+ * Сдвигает счётчик trigger: его потребители получают invalidation. Trigger
353
+ * без потребителей убирается из индекса здесь.
354
+ *
355
+ * Значение trigger только растёт, поэтому сдвиг нельзя отменить следующим:
356
+ * ключ, через который batch прошёл туда и обратно, остаётся изменённым, пока
357
+ * его не прочитает потребитель.
358
+ *
359
+ * Сдвиг — обычная запись signal. Вне группировки она прямая, и потребителя
360
+ * engine делает обязательным к пересчёту в любом его состоянии: без пометок,
361
+ * помеченного «проверить» записью, которую её batch затем отменил
362
+ * (`direct-write-after-check.spec.ts`), и стоящего на стеке собственной
363
+ * проверки зависимостей, getter которой записал source
364
+ * (`direct-write-during-check.spec.ts`, блок `selector trigger`). Внутри
365
+ * группировки сдвиг откладывается у trigger до первого чтения вместе с
366
+ * записью самого source.
367
+ *
368
+ * Потребителя, который выполняется в момент прямого сдвига, engine помечает
369
+ * как при записи любого signal, и непрочитанного сдвига у trigger для него
370
+ * не остаётся. Runtime планирует заново только phase effect, который читает
371
+ * selector сам. Effect без задачи и computed, вернувший прежнее значение,
372
+ * остаются со старым ответом до следующей записи, которая меняет ответ
373
+ * ключа: пометку записи, пришедшей во время запуска, engine с них снимает.
374
+ * Старый ответ такого computed получает и каждый его читатель — phase effect
375
+ * любой формы регистрации, watch и прямое чтение, — в том числе после
376
+ * собственного повторного запуска. Отложенный сдвиг подтверждала им
377
+ * следующая проверка зависимостей или следующий читатель ключа, прямой —
378
+ * нет; обычный signal на месте selector ведёт себя так же, как прямой сдвиг
379
+ * (тот же файл, блок `selector source written while a consumer of the key
380
+ * runs`; причина в engine — блок `known limitations`).
381
+ */
382
+ _bump(e, s, t) {
383
+ t._bumpSignalNode(s) || this._forget(e);
384
+ }
385
+ /**
386
+ * Сравнивает один наблюдаемый ключ с прежним и с новым значением source и
387
+ * будит его потребителей, если ответ изменился. Ответ, который не удалось
388
+ * вычислить, считается изменившимся: потребитель встретит то же исключение
389
+ * в собственном чтении. Сбои копятся в `errors`; возвращается их список.
390
+ */
391
+ _wakeChanged(e, s, t, r, i, n) {
392
+ let o = !0;
393
+ try {
394
+ o = i(e, t) !== i(e, r);
395
+ } catch (h) {
396
+ (n ??= []).push(h);
397
+ }
398
+ if (o)
399
+ try {
400
+ this._bump(e, s, this._reactivity);
401
+ } catch (h) {
402
+ (n ??= []).push(h);
403
+ }
404
+ return n;
405
+ }
406
+ /**
407
+ * Возвращает trigger ключа из той части индекса, где лежит ключ. Место ряда
408
+ * с убранным trigger отвечает undefined, как отсутствующий ключ. Место ряда
409
+ * проверяется так же, как при чтении: по нему должен получаться сам ключ.
410
+ */
411
+ _find(e) {
412
+ if (typeof e == "number") {
413
+ const t = this._dense, r = this._denseBase, i = e - r;
414
+ if (i >= 0 && i < t.length && i === (i | 0) && r + i === e)
415
+ return t[i];
416
+ }
417
+ const s = this._triggers;
418
+ return s === void 0 ? void 0 : s.get(e);
419
+ }
420
+ /**
421
+ * Убирает trigger ключа из той части индекса, где лежит ключ.
422
+ *
423
+ * Место ряда остаётся пустым, и ряд не сдвигается, даже когда ключ стоял на
424
+ * его краю: запись, убравшая ключ, стоит одинаково при любой длине ряда.
425
+ * Порядок в ряду наводит уборка, которая и так обходит его целиком. Запись
426
+ * делает это сама в двух случаях: ряд опустел, либо мест в нём стало больше,
427
+ * чем вдвое против допустимого для обрезанного ряда. Во втором случае проход
428
+ * оставляет от ряда меньше половины мест либо переносит его в общий индекс,
429
+ * поэтому его цена ложится на создание убранных мест, а не на записи.
430
+ */
431
+ _forget(e) {
432
+ if (typeof e == "number") {
433
+ const t = this._dense, r = this._denseBase, i = e - r;
434
+ if (i >= 0 && i < t.length && i === (i | 0) && r + i === e) {
435
+ if (t[i] !== void 0) {
436
+ t[i] = void 0;
437
+ const n = --this._denseCount;
438
+ (n === 0 || t.length > (n * 2 + 32) * 2) && this._settleDense();
439
+ }
440
+ return;
441
+ }
442
+ }
443
+ const s = this._triggers;
444
+ s !== void 0 && s.delete(e);
445
+ }
446
+ /**
447
+ * Приводит ряд в порядок после того, как из него убраны triggers: опустевший
448
+ * ряд становится пустым, пустые места с краёв срезаются, а ряд, в котором
449
+ * после этого мест больше удвоенного числа занятых плюс запас, целиком
450
+ * переносится в общий индекс. Так ряд занимает память, пропорциональную
451
+ * числу своих ключей, какой бы старый ключ ни остался наблюдаемым.
452
+ *
453
+ * Проход стоит длины ряда, поэтому его вызывают уборка и запись со своим
454
+ * сравнением, которые обходят ряд сами, а запись, убравшая один ключ, —
455
+ * только по правилу из `_forget()`. Пока запись обходит индекс, ряд не
456
+ * сдвигается и не переносится: порядок наведёт сам обход.
457
+ *
458
+ * Срез начала сдвигает начало ряда на число срезанных мест. Ключ первого
459
+ * оставшегося места — целое число, равное этой сумме, поэтому сложение
460
+ * точное.
461
+ */
462
+ _settleDense() {
463
+ if (this._scanning)
464
+ return;
465
+ const e = this._dense, s = this._denseCount;
466
+ if (s === 0) {
467
+ e.length = 0;
468
+ return;
469
+ }
470
+ let t = e.length, r = 0;
471
+ for (; r < t && e[r] === void 0; )
472
+ r++;
473
+ for (; t > r && e[t - 1] === void 0; )
474
+ t--;
475
+ if (t - r > s * 2 + 32) {
476
+ const i = this._denseBase, n = this._triggers ??= /* @__PURE__ */ new Map();
477
+ for (let o = r; o < t; o++) {
478
+ const h = e[o];
479
+ h !== void 0 && n.set(i + o, h);
480
+ }
481
+ e.length = 0, this._denseCount = 0;
482
+ return;
483
+ }
484
+ r !== 0 && (e.copyWithin(0, r, t), this._denseBase += r), e.length = t - r;
485
+ }
486
+ }
487
+ function g(c) {
488
+ return (e) => c._test(e);
489
+ }
490
+ function a(c, e) {
491
+ return {
492
+ token: e,
493
+ onDependency: () => {
494
+ const s = c._trackedKey;
495
+ return () => {
496
+ c._edgeDetached(s);
497
+ };
498
+ }
499
+ };
500
+ }
501
+ export {
502
+ f as RuntimeSelector
503
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("../errors.cjs"),_=require("../ownership/throwDisposalErrors.cjs");class v{constructor(e,s,t){this.owner=e,this.kind=s,this.includeRuntime=t,this.subscribers=void 0,this.memberships=void 0,this.implicitConsumers=void 0,this.source=void 0,this.activate=void 0,this.runtimeActivation=void 0,this.lastCause=void 0,this.transientNext=void 0,this.revision=0,this.disposed=!1}get runtime(){return this.owner.runtime}get[Symbol.toStringTag](){return"RaphProducer"}toJSON(){return{kind:this.kind,owner:this.owner.id,revision:this.revision,disposed:this.disposed}}}v.prototype._isProducer=!0;const R=new WeakMap,k=Object.freeze([]),A=Object.freeze([]);class f{constructor(e,s){this.owner=e,this._sources=$(s)}_sources;_disposed=!1;_releaseOwner;_memberReleases;_firstSubscription;_lastSubscription;_firstDependent;_lastDependent;_revision=0;_finalCause;static _create(e,s){return new f(e,s)}get runtime(){return this.owner.runtime}get disposed(){return this._disposed}get sources(){return this._sources}dispose(){if(this._disposed)return;const e=this.runtime,s=!e._ownerDisposalActive();s&&e._beginOwnerDisposal();const t=[];try{const i=this._releaseOwner;i!==void 0?(this._releaseOwner=void 0,i()):this._disposeOwned()}catch(i){t.push(i)}finally{if(s)try{e._endOwnerDisposal()}catch(i){t.push(i)}}_.throwDisposalErrors(t,"[Raph] Aggregate disposal failed.")}_assertAlive(){if(this._disposed||this.owner.disposed)throw new m.RaphDisposedError("[Raph] Aggregate is disposed.")}_bindOwner(e){this._releaseOwner=e}_bindMembers(e){this._memberReleases=e.length===0?void 0:e}_removeMember(e){if(this._disposed)return;const s=this._sources.filter(t=>N(t)!==e);s.length!==this._sources.length&&(this._sources=s.length===0?k:Object.freeze(s))}_disposeOwned(){if(this._disposed)return;this._disposed=!0,this._releaseOwner=void 0;const e=d(this.owner)&&!this.owner._isPublished()?void 0:this._disposalCause(),s=[];let t=this._firstSubscription;for(this._firstSubscription=this._lastSubscription=void 0;t!==void 0;){const o=t.next,u=t.dispose;t.aggregate=void 0,t.dispose=void 0,t.previous=t.next=void 0;try{u?.(e)}catch(a){s.push(a)}t=o}const i=this._memberReleases;if(this._memberReleases=void 0,i!==void 0)for(let o=i.length-1;o>=0;o--)try{i[o]()}catch(u){s.push(u)}this._sources=k;let r=this._firstDependent;for(this._firstDependent=this._lastDependent=void 0;r!==void 0;){const o=r.next,u=r.cleanup;r.source=void 0,r.cleanup=void 0,r.previous=r.next=void 0;try{u?.()}catch(a){s.push(a)}r=o}_.throwDisposalErrors(s,"[Raph] Aggregate owned cleanup failed.")}_linkSubscription(e){this._assertAlive();const s={aggregate:this,dispose:e,previous:this._lastSubscription};return this._lastSubscription===void 0?this._firstSubscription=s:this._lastSubscription.next=s,this._lastSubscription=s,()=>U(s)}_linkDependent(e){e.previous=this._lastDependent,this._lastDependent===void 0?this._firstDependent=e:this._lastDependent.next=e,this._lastDependent=e}_detachDependent(e){e.previous===void 0?this._firstDependent=e.next:e.previous.next=e.next,e.next===void 0?this._lastDependent=e.previous:e.next.previous=e.previous,e.previous=e.next=void 0}_disposalCause(){return this._finalCause??=Object.freeze({kind:"structure",source:this,sourceOwner:this.owner,revision:++this._revision,metadata:Object.freeze({disposed:!0})})}_detachSubscription(e){if(e.aggregate===void 0)return;const s=e.dispose;e.aggregate=void 0,e.dispose=void 0,e.previous===void 0?this._firstSubscription=e.next:e.previous.next=e.next,e.next===void 0?this._lastSubscription=e.previous:e.next.previous=e.previous,e.previous=e.next=void 0,s?.()}}class W{constructor(e){this._runtime=e}_selfSubscribers;_subtreeSubscribers;_runtimeSubscribers;_runtimeSubscriberCount=0;_runtimeActivationProducers;_nodeMemberships;_nodeRevisions;_nodeTouchKeys;_implicitProducers;_transientProducers;_dispatchDepth=0;_detachedEdges;_disposed=!1;createProducer(e,s="producer",t={}){return this._assertAlive(),new v(e,s,t.includeRuntime??!0)}attachProducer(e,s){const t=e.source;return t!==void 0&&t!==e&&R.delete(t),e.source=s,R.set(s,e),s}setProducerActivation(e,s,t=!1){if(e.disposed)throw new m.RaphDisposedError("[Raph] Producer is disposed.");if(e.activate=s,!t)return;const i=this._runtimeActivationProducers??=new Set;if(i.add(e),this._runtimeSubscriberCount!==0)try{e.runtimeActivation=C(s())}catch(r){throw i.delete(e),i.size===0&&(this._runtimeActivationProducers=void 0),r}}producerHooks(e){return{token:e,dependencyOwner:e.owner,onDependency:s=>this._linkImplicitDependency(e,s),onChange:(s,t,i)=>{this.notifyProducer(e,s,t,void 0,!0,i,!0)},onInvalidate:s=>this.notifyProducer(e,void 0,void 0,void 0,!0,s,!1),onDispose:s=>this._disposeProducer(e,s)}}causeForToken(e){if(typeof e!="object"||e===null)return;const s=e;if(!(s._isProducer!==!0||s.owner.runtime!==this._runtime))return s.lastCause}clearTransientCauses(){let e=this._transientProducers;for(this._transientProducers=void 0;e!==void 0;){const s=e.transientNext;e.transientNext=void 0,e.lastCause=void 0,e=s}}notifyProducer(e,s,t,i,r=!0,o=!1,u=!1){if(this._disposed||e.disposed||e.source===void 0||d(e.owner)&&!e.owner._isPublished()||!u&&i===void 0&&e.lastCause!==void 0)return;if(!o&&e.subscribers?.first===void 0&&(!e.includeRuntime||this._runtimeSubscribers?.first===void 0)){this._dispatchProducerLazily(e,s,t,i,r,u);return}const a=u&&i===void 0?y(e.kind,e.source,e.owner,++e.revision,s,t):{kind:e.kind,source:e.source,sourceOwner:e.owner,revision:++e.revision,...u?{previous:s,value:t}:{},...i===void 0?{}:{events:Object.freeze([...i])}};this._setTransientCause(e,a),this._dispatchProducer(e,a,r)}_notifyValueWrite(e,s,t,i){const r=e.source;if(this._disposed||e.disposed||r===void 0)return;const o=e.owner;if(o._isNode&&!o._isPublished())return;const u=e.subscribers;if(!i&&u?.first===void 0&&(!e.includeRuntime||this._runtimeSubscribers?.first===void 0)){this._dispatchProducerLazily(e,s,t,void 0,!0,!0);return}const a=y(e.kind,r,o,++e.revision,s,t);e.lastCause===void 0&&(e.transientNext=this._transientProducers,this._transientProducers=e),e.lastCause=a,!(u===void 0&&this._selfSubscribers===void 0&&this._subtreeSubscribers===void 0&&this._runtimeSubscribers===void 0)&&this._dispatchProducer(e,a,!0)}notifyProducerEvents(e,s,t=!0,i=!1){if(this._disposed||e.disposed||e.source===void 0||d(e.owner)&&!e.owner._isPublished())return;if(!i&&e.subscribers?.first===void 0&&(!e.includeRuntime||this._runtimeSubscribers?.first===void 0)){this._dispatchProducerLazily(e,void 0,void 0,s,t,!1);return}const r={kind:e.kind,source:e.source,sourceOwner:e.owner,revision:++e.revision,events:Object.freeze([...s])};this._setTransientCause(e,r),this._dispatchProducer(e,r,t)}_hasStructuralDemand(e){if(this._runtimeSubscribers!==void 0||this._subtreeSubscribers!==void 0)return!0;const s=this._selfSubscribers;return s!==void 0&&s.has(e)}_hasNodeSubscribers(){return this._runtimeSubscribers!==void 0||this._subtreeSubscribers!==void 0||this._selfSubscribers!==void 0}notifyNode(e,s,t={}){if(this._disposed||!e._isPublished()||this._runtimeSubscribers?.first===void 0&&this._selfSubscribers?.get(e)?.first===void 0&&this._subtreeSubscribers===void 0)return;const i=t.oldAncestors===void 0&&t.newAncestors===void 0?this._subtreeSubscribers===void 0?A:P(e):void 0,r=t.oldAncestors??i??A,o=t.newAncestors??i??A;if(!this._nodeHasDemand(e,r,o))return;const u=this._nodeRevisions??=new WeakMap,a=(u.get(e)??0)+1;u.set(e,a);const c={kind:s,source:e,sourceOwner:e,revision:a,...t.metadata===void 0?{}:{metadata:t.metadata},...t.structure===void 0?{}:{structure:Object.freeze({...t.structure})}},h=s==="structure"?e:this._nodeTouchKey(e);if(this._dispatch(this._selfSubscribers?.get(e),c,h),i!==void 0)for(const l of i)this._dispatch(this._subtreeSubscribers?.get(l),c,h);else{const l=new Set;for(const p of r)l.add(p);for(const p of o)l.add(p);for(const p of l)this._dispatch(this._subtreeSubscribers?.get(p),c,h)}this._dispatch(this._runtimeSubscribers,c,h)}createAggregate(e,s){if(this._assertOwner(e),s.length===0)throw new TypeError("[Raph] Aggregate requires at least one source.");this._validateAggregateSources(s,new Set);for(const o of s)this._assertSourceVisibleTo(e,o,new Set);const t=f._create(e,s),i=[],r=new Set;try{for(const o of t.sources){const u=N(o);if(u===void 0||r.has(u))continue;r.add(u);const a=this._linkSourceCleanup(o,()=>t._removeMember(u));a!==void 0&&i.push(a)}return t._bindMembers(i),t._bindOwner(e._adoptResource(()=>t._disposeOwned())),t}catch(o){const u=[];for(let a=i.length-1;a>=0;a--)try{i[a]()}catch(c){u.push(c)}throw u.length!==0?new AggregateError([o,...u],"[Raph] Aggregate registration and rollback failed."):o}}subscribe(e,s,t){this._assertAlive();const i=[],r=new WeakMap;try{this._subscribeOne(e,s,t,i,r,new Set)}catch(u){const a=[];for(let c=i.length-1;c>=0;c--)try{i[c]()}catch(h){a.push(h)}throw a.length!==0?new AggregateError([u,...a],"[Raph] Granular subscription registration and rollback failed."):u}let o=!0;return()=>{if(!o)return;o=!1;const u=[];for(let a=i.length-1;a>=0;a--)try{i[a]()}catch(c){u.push(c)}_.throwDisposalErrors(u,"[Raph] Granular subscription disposal failed.")}}assertSubscriptionAllowed(e,s){this._assertOwner(e),this._assertSourceVisibleTo(e,s,new Set)}assertReparentAllowed(e,s){const t=this._implicitProducers;if(t!==void 0)for(const i of t){const r=i.owner;if(!d(r))continue;const o=i.implicitConsumers;if(o!==void 0)for(const u of o.keys())x(u,e)&&(x(r,e)||G(r,s)||T(e,u,r))}this._assertSignalEdgesAllowReparent(e,s)}_assertSignalEdgesAllowReparent(e,s){const t=e.parent;if(t===null)return;const i=I(t,s);if(i===t)return;const r=this._runtime._getReactivity();for(let o=t;o!==null&&o!==i;o=o.parent){const u=r._findSignalConsumerOwner(o,L,e);u!==void 0&&T(e,u,o)}}releaseNode(e){this._releaseGranule(this._selfSubscribers,e),this._releaseGranule(this._subtreeSubscribers,e);const s=this._nodeMemberships?.get(e);if(s!==void 0){this._nodeMemberships.delete(e);try{this._releaseCleanupList(s)}finally{this._nodeMemberships?.size===0&&(this._nodeMemberships=void 0)}}}dispose(){if(this._disposed)return;this._disposed=!0;const e=[];if(this.clearTransientCauses(),this._implicitProducers!==void 0){for(const s of this._implicitProducers)s.implicitConsumers=void 0;this._implicitProducers.clear(),this._implicitProducers=void 0}try{this._releaseRuntimeActivations()}catch(s){e.push(s)}if(this._runtimeActivationProducers?.clear(),this._runtimeActivationProducers=void 0,this._runtimeSubscriberCount=0,this._selfSubscribers!==void 0)for(const s of[...this._selfSubscribers.keys()])this._releaseGranule(this._selfSubscribers,s);if(this._subtreeSubscribers!==void 0)for(const s of[...this._subtreeSubscribers.keys()])this._releaseGranule(this._subtreeSubscribers,s);if(this._nodeMemberships!==void 0){for(const s of this._nodeMemberships.values())this._releaseCleanupList(s,!1);this._nodeMemberships.clear(),this._nodeMemberships=void 0}if(this._runtimeSubscribers!==void 0){try{this._releaseWorkList(this._runtimeSubscribers)}catch(s){e.push(s)}this._runtimeSubscribers=void 0}_.throwDisposalErrors(e,"[Raph] Work graph disposal failed.")}_disposeProducer(e,s=!1){if(e.disposed)return;const t=e.source,i=!d(e.owner)||e.owner._isPublished();let r;if(t!==void 0&&i&&(s||this._producerHasDemand(e))){const a={kind:"structure",source:t,sourceOwner:e.owner,revision:++e.revision,metadata:Object.freeze({disposed:!0})};this._setTransientCause(e,a);const c=t===e?a:t;try{this._dispatchProducer(e,a,!0,c)}catch(h){(r??=[]).push(h)}}e.disposed=!0;const o=e.runtimeActivation;e.runtimeActivation=void 0,this._runtimeActivationProducers?.delete(e),this._runtimeActivationProducers?.size===0&&(this._runtimeActivationProducers=void 0);try{o?.()}catch(a){(r??=[]).push(a)}if(e.memberships!==void 0){try{this._releaseCleanupList(e.memberships)}catch(a){(r??=[]).push(a)}e.memberships=void 0}const u=e.source;if(u!==void 0&&u!==e&&R.delete(u),e.subscribers!==void 0)try{this._releaseWorkList(e.subscribers)}catch(a){(r??=[]).push(a)}finally{e.subscribers=void 0}e.activate=void 0,e.source=void 0,r!==void 0&&_.throwDisposalErrors(r,"[Raph] Runtime producer disposal failed.")}_dispatchProducer(e,s,t=!0,i=e){this._dispatch(e.subscribers,s,i,t);const r=e.owner;if(d(r)&&(this._dispatch(this._selfSubscribers?.get(r),s,i,t),this._subtreeSubscribers!==void 0))for(const o of P(r))this._dispatch(this._subtreeSubscribers?.get(o),s,i,t);e.includeRuntime&&this._dispatch(this._runtimeSubscribers,s,i,t)}_dispatchProducerLazily(e,s,t,i,r,o){const u=e.owner;let a;if(d(u)){const h=this._selfSubscribers?.get(u);h?.first!==void 0&&(a=this._createProducerCause(e,s,t,i,o),this._dispatch(h,a,e,r));const l=this._subtreeSubscribers;if(l!==void 0)for(let p=u;p!==null;){const j=p.parent,O=l.get(p);O?.first!==void 0&&(a??=this._createProducerCause(e,s,t,i,o),this._dispatch(O,a,e,r)),p=j}}const c=e.includeRuntime?this._runtimeSubscribers:void 0;c?.first!==void 0&&(a??=this._createProducerCause(e,s,t,i,o),this._dispatch(c,a,e,r))}_createProducerCause(e,s,t,i,r){const o=++e.revision,u=r?i===void 0?y(e.kind,e.source,e.owner,o,s,t):{kind:e.kind,source:e.source,sourceOwner:e.owner,revision:o,previous:s,value:t,events:Object.freeze([...i])}:i===void 0?{kind:e.kind,source:e.source,sourceOwner:e.owner,revision:o}:{kind:e.kind,source:e.source,sourceOwner:e.owner,revision:o,events:Object.freeze([...i])};return this._setTransientCause(e,u),u}_retainRuntimeSubscriber(){if(this._runtimeSubscriberCount++,this._runtimeSubscriberCount!==1)return;const e=[],s=[];try{for(const t of this._runtimeActivationProducers??[])t.disposed||t.runtimeActivation!==void 0||(t.runtimeActivation=C(t.activate?.()),e.push(t));return}catch(t){s.push(t)}this._runtimeSubscriberCount=0;for(let t=e.length-1;t>=0;t--){const i=e[t],r=i.runtimeActivation;i.runtimeActivation=void 0;try{r?.()}catch(o){s.push(o)}}throw s.length===1?s[0]:new AggregateError(s,"[Raph] Runtime granule activation failed and rollback was incomplete.")}_releaseRuntimeSubscriber(){this._runtimeSubscriberCount!==0&&(this._runtimeSubscriberCount--,this._runtimeSubscriberCount===0&&this._releaseRuntimeActivations())}_releaseRuntimeActivations(){const e=[];for(const s of this._runtimeActivationProducers??[]){const t=s.runtimeActivation;s.runtimeActivation=void 0;try{t?.()}catch(i){e.push(i)}}_.throwDisposalErrors(e,"[Raph] Runtime granule activation cleanup failed.")}_linkImplicitDependency(e,s){const t=e.owner,i=s;if(e.disposed||i.runtime!==this._runtime||!d(t)||!d(i)||t===i)return;const r=e.implicitConsumers??=new Map;r.set(i,(r.get(i)??0)+1),(this._implicitProducers??=new Set).add(e);let u=!0;return()=>{if(!u)return;u=!1;const a=e.implicitConsumers?.get(i);if(a!==void 0){if(a>1){e.implicitConsumers.set(i,a-1);return}e.implicitConsumers.delete(i),e.implicitConsumers.size===0&&(e.implicitConsumers=void 0,this._implicitProducers?.delete(e),this._implicitProducers?.size===0&&(this._implicitProducers=void 0))}}}_subscribeOne(e,s,t,i,r,o){if(s!==void 0&&!d(e))throw new TypeError("[Raph] watch include applies only to a bare RaphNode source.");if(e instanceof f){if(e._assertAlive(),this._assertRuntime(e.runtime),o.has(e))throw new TypeError("[Raph] Aggregate sources cannot contain a cycle.");o.add(e);const u=[];try{for(const a of e.sources)this._subscribeOne(a,void 0,t,u,r,o);i.push(e._linkSubscription(a=>{const c=[];if(a!==void 0)try{t(a,e,!0)}catch(h){c.push(h)}for(let h=u.length-1;h>=0;h--)try{u[h]()}catch(l){c.push(l)}_.throwDisposalErrors(c,"[Raph] Aggregate member subscription disposal failed.")}))}catch(a){const c=[];for(let h=u.length-1;h>=0;h--)try{u[h]()}catch(l){c.push(l)}throw o.delete(e),c.length!==0?new AggregateError([a,...c],"[Raph] Aggregate subscription registration and rollback failed."):a}o.delete(e);return}if(w(e)){this._subscribeNode(e.source,e.include,t,i,r);return}if(d(e)){this._subscribeNode(e,s??"self",t,i,r);return}if(g(e)){this._assertRuntime(e),i.push(E(r,e,()=>{const u=this._runtimeSubscribers??={},a={kind:"runtime",sink:t,source:e};this._appendWorkEdge(u,a);try{this._retainRuntimeSubscriber()}catch(c){throw a.source=void 0,this._detachWorkEdge(u,a),u.first===void 0&&(this._runtimeSubscribers=void 0),c}return()=>{a.source!==void 0&&(a.source=void 0,this._detachWorkEdge(this._runtimeSubscribers,a),this._runtimeSubscribers?.first===void 0&&(this._runtimeSubscribers=void 0),this._releaseRuntimeSubscriber())}}));return}if(b(e)){const u=S(e);if(u!==void 0){if(this._assertRuntime(u.runtime),u.disposed)throw new m.RaphDisposedError("[Raph] Producer is disposed.");i.push(E(r,u,()=>{const a=u.subscribers??={},c={kind:"producer",sink:t,source:u};this._appendWorkEdge(a,c);try{c.activationRelease=C(u.activate?.())}catch(h){throw c.source=void 0,this._detachWorkEdge(a,c),a.first===void 0&&(u.subscribers=void 0),h}return()=>{const h=c.activationRelease;c.activationRelease=void 0;const l=c.source;l instanceof v&&(c.source=void 0,this._detachWorkEdge(l.subscribers,c),l.subscribers?.first===void 0&&(l.subscribers=void 0)),h?.()}}));return}}throw new TypeError("[Raph] Unsupported or ownerless granular watch source.")}_subscribeNode(e,s,t,i,r){if(this._assertRuntime(e.runtime),e._assertAlive(),s!=="self"&&s!=="subtree")throw new TypeError(`[Raph] Unsupported node include mode "${String(s)}".`);const o=s==="self"?e:e._subtreeSourceIdentity;i.push(E(r,o,()=>{const u=s==="self"?this._selfSubscribers??=new Map:this._subtreeSubscribers??=new Map;let a=u.get(e);a===void 0&&(a={},u.set(e,a));const c={kind:s,sink:t,source:e};return this._appendWorkEdge(a,c),this._createNodeEdgeRelease(c)}))}_createNodeEdgeRelease(e){return()=>{const s=e.source;if(!d(s))return;e.source=void 0;const t=e.kind==="self"?this._selfSubscribers:this._subtreeSubscribers,i=t?.get(s);this._detachWorkEdge(i,e),i?.first===void 0&&(t?.delete(s),t?.size===0&&(e.kind==="self"?this._selfSubscribers=void 0:this._subtreeSubscribers=void 0))}}_linkSourceCleanup(e,s){const t=H(e);if(t===void 0)return;const i={cleanup:s,source:t};if(t instanceof v){const r=t.memberships??={};M(r,i)}else if(t instanceof f)t._linkDependent(i);else{const r=this._nodeMemberships??=new Map;let o=r.get(t);o===void 0&&(o={},r.set(t,o)),M(o,i)}return()=>this._detachCleanupEdge(i)}_detachCleanupEdge(e){const s=e.source;if(s===void 0)return;if(e.source=void 0,e.cleanup=void 0,s instanceof v){z(s.memberships,e),s.memberships?.first===void 0&&(s.memberships=void 0);return}if(s instanceof f){s._detachDependent(e);return}const t=this._nodeMemberships?.get(s);z(t,e),t?.first===void 0&&(this._nodeMemberships?.delete(s),this._nodeMemberships?.size===0&&(this._nodeMemberships=void 0))}_releaseCleanupList(e,s=!0){let t=e.first;e.first=e.last=void 0;const i=[];for(;t!==void 0;){const r=t.next,o=t.cleanup;if(t.source=void 0,t.cleanup=void 0,t.previous=t.next=void 0,s)try{o?.()}catch(u){i.push(u)}t=r}_.throwDisposalErrors(i,"[Raph] Aggregate membership cleanup failed.")}_validateAggregateSources(e,s){for(const t of e){if(Array.isArray(t))throw new TypeError("[Raph] Nested source arrays are not supported; create a named aggregate.");if(t instanceof f){if(t._assertAlive(),this._assertRuntime(t.runtime),s.has(t))throw new TypeError("[Raph] Aggregate sources cannot contain a cycle.");s.add(t),this._validateAggregateSources(t.sources,s),s.delete(t)}else if(w(t)){if(this._assertRuntime(t.source.runtime),t.source._assertAlive(),t.include!=="self"&&t.include!=="subtree")throw new TypeError(`[Raph] Unsupported node include mode "${String(t.include)}".`)}else if(d(t))this._assertRuntime(t.runtime),t._assertAlive();else if(g(t))this._assertRuntime(t);else if(b(t)){const i=S(t);if(i===void 0||i.disposed)throw new m.RaphDisposedError("[Raph] Aggregate producer is disposed or ownerless.");this._assertRuntime(i.runtime)}else throw new TypeError("[Raph] Unsupported aggregate source.")}}_assertSourceVisibleTo(e,s,t){if(s instanceof f){if(this._assertProvisionalOwnerAccess(e,s.owner),t.has(s))return;t.add(s);for(const r of s.sources)this._assertSourceVisibleTo(e,r,t);t.delete(s);return}if(w(s)){this._assertProvisionalOwnerAccess(e,s.source);return}if(d(s)){this._assertProvisionalOwnerAccess(e,s);return}if(g(s)||!b(s))return;const i=S(s);i!==void 0&&this._assertProvisionalOwnerAccess(e,i.owner)}_assertProvisionalOwnerAccess(e,s){if(!(!d(s)||s._isPublished())&&!(d(e)&&!e._isPublished()&&D(e)===D(s)))throw new Error(`[Raph] Owner "${e.id}" cannot subscribe to provisional source owner "${s.id}".`)}_dispatch(e,s,t,i=!0){let r=e?.first;if(r===void 0)return;const o=e.last;this._dispatchDepth++;try{for(;r!==void 0;){const u=r.next;if(r.source!==void 0&&r.sink(s,t,i),r===o)break;r=u}}finally{if(--this._dispatchDepth===0&&this._detachedEdges!==void 0){for(const u of this._detachedEdges)u.previous=u.next=void 0;this._detachedEdges=void 0}}}_appendWorkEdge(e,s){s.previous=e.last,e.last===void 0?e.first=s:e.last.next=s,e.last=s}_detachWorkEdge(e,s){e!==void 0&&(s.previous===void 0?e.first=s.next:s.previous.next=s.next,s.next===void 0?e.last=s.previous:s.next.previous=s.previous,this._dispatchDepth===0?s.previous=s.next=void 0:(this._detachedEdges??=[]).push(s))}_releaseWorkList(e){let s=e.first;const t=[];for(;s!==void 0;){const i=s.next,r=s.activationRelease;s.activationRelease=void 0,s.source=void 0,this._detachWorkEdge(e,s);try{r?.()}catch(o){t.push(o)}s=i}_.throwDisposalErrors(t,"[Raph] Granular source activation cleanup failed.")}_releaseGranule(e,s){const t=e?.get(s);t!==void 0&&(e.delete(s),this._releaseWorkList(t),e.size===0&&(e===this._selfSubscribers&&(this._selfSubscribers=void 0),e===this._subtreeSubscribers&&(this._subtreeSubscribers=void 0)))}_setTransientCause(e,s){e.lastCause===void 0&&(e.transientNext=this._transientProducers,this._transientProducers=e),e.lastCause=s}_producerHasDemand(e){if(d(e.owner)&&!e.owner._isPublished())return!1;if(e.subscribers?.first!==void 0||e.includeRuntime&&this._runtimeSubscribers?.first!==void 0)return!0;const s=e.owner;if(!d(s))return!1;if(this._selfSubscribers?.get(s)?.first!==void 0)return!0;if(this._subtreeSubscribers===void 0)return!1;for(const t of P(s))if(this._subtreeSubscribers.get(t)?.first!==void 0)return!0;return!1}_nodeTouchKey(e){const s=this._nodeTouchKeys??=new WeakMap;let t=s.get(e);return t===void 0&&(t=Object.freeze({}),s.set(e,t)),t}_nodeHasDemand(e,s,t){if(this._runtimeSubscribers?.first!==void 0||this._selfSubscribers?.get(e)?.first!==void 0)return!0;if(this._subtreeSubscribers===void 0)return!1;for(const i of s)if(this._subtreeSubscribers.get(i)?.first!==void 0)return!0;for(const i of t)if(this._subtreeSubscribers.get(i)?.first!==void 0)return!0;return!1}_assertOwner(e){this._assertRuntime(e.runtime),e._assertAlive()}_assertRuntime(e){if(e!==this._runtime)throw new m.RaphCrossRuntimeError("[Raph] Granular source belongs to another runtime.")}_assertAlive(){if(this._disposed)throw new m.RaphDisposedError("[Raph] Work graph is disposed.")}}function D(n){let e=n;for(;e.parent!==null&&!e.parent._isPublished();)e=e.parent;return e}function P(n){const e=[];for(let s=n;s!==null;s=s.parent)e.push(s);return e}function x(n,e){for(let s=n;s!==null;s=s.parent)if(s===e)return!0;return!1}function G(n,e){for(let s=e;s!==null;s=s.parent)if(s===n)return!0;return!1}function L(n,e){return d(n)&&x(n,e)}function I(n,e){let s=0;for(let o=n.parent;o!==null;o=o.parent)s++;let t=0;for(let o=e.parent;o!==null;o=o.parent)t++;let i=n,r=e;for(;s>t;s--)i=i.parent;for(;t>s;t--)r=r.parent;for(;i!==r;)i=i.parent,r=r.parent;return i}function T(n,e,s){throw new Error(`[Raph] Cannot reparent "${n.id}": implicit dependency from "${e.id}" to "${s.id}" would become invalid; use watch().`)}function $(n){return Object.freeze(n.map(e=>w(e)?Object.freeze({source:e.source,include:e.include}):e))}W._valueCauseShapeAnchor=y("producer",void 0,void 0,0,void 0,void 0);function y(n,e,s,t,i,r){return{kind:n,source:e,sourceOwner:s,revision:t,previous:i,value:r}}function N(n){return n instanceof f?n:w(n)?n.source:d(n)||g(n)?n:b(n)?S(n):void 0}function H(n){if(n instanceof f)return n;if(w(n))return n.source;if(d(n))return n;if(!g(n))return b(n)?S(n):void 0}function M(n,e){e.previous=n.last,n.last===void 0?n.first=e:n.last.next=e,n.last=e}function U(n){n.aggregate?._detachSubscription(n)}function z(n,e){n!==void 0&&(e.previous===void 0?n.first=e.next:e.previous.next=e.next,e.next===void 0?n.last=e.previous:e.next.previous=e.previous,e.previous=e.next=void 0)}function E(n,e,s){let t=n.get(e);t===void 0&&(t={count:0,dispose:s()},n.set(e,t)),t.count++;let i=!0;return()=>{if(!i||(i=!1,--t.count!==0))return;const r=t.dispose;t.dispose=K,r()}}function K(){}function C(n){return typeof n=="function"?n:void 0}function S(n){return n instanceof v?n.source===n?n:void 0:R.get(n)}function w(n){return b(n)&&"source"in n&&d(n.source)&&"include"in n}function d(n){return b(n)&&n._isNode===!0}function g(n){return b(n)&&"rootScope"in n&&"definePhases"in n&&"configuration"in n}function b(n){return typeof n=="object"&&n!==null}exports.RaphAggregate=f;exports.RaphProducer=v;exports.RaphWorkGraph=W;