@raphy-js/raph 1.0.0-dev.18

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 (186) hide show
  1. package/LICENSE +202 -0
  2. package/dist/api/Raph.d.ts +97 -0
  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 +25 -0
  6. package/dist/api/types.d.ts +170 -0
  7. package/dist/core-CyilRD7s.js +1055 -0
  8. package/dist/core-ugchZNqC.cjs +1 -0
  9. package/dist/debug/api/Raph.cjs +1 -0
  10. package/dist/debug/api/Raph.js +421 -0
  11. package/dist/debug/api/RaphFacadeSession.cjs +1 -0
  12. package/dist/debug/api/RaphFacadeSession.js +306 -0
  13. package/dist/debug/api/RaphReactivityInstance.cjs +1 -0
  14. package/dist/debug/api/RaphReactivityInstance.js +149 -0
  15. package/dist/debug/api/errors.cjs +1 -0
  16. package/dist/debug/api/errors.js +17 -0
  17. package/dist/debug/api/types.cjs +1 -0
  18. package/dist/debug/api/types.js +1 -0
  19. package/dist/debug/path/DataPath.cjs +1 -0
  20. package/dist/debug/path/DataPath.js +394 -0
  21. package/dist/debug/path/PathRouter.cjs +1 -0
  22. package/dist/debug/path/PathRouter.js +86 -0
  23. package/dist/debug/path/RaphKernel.cjs +1 -0
  24. package/dist/debug/path/RaphKernel.js +687 -0
  25. package/dist/debug/path/data-path.types.cjs +1 -0
  26. package/dist/debug/path/data-path.types.js +1 -0
  27. package/dist/debug/path/data-path.utils.cjs +1 -0
  28. package/dist/debug/path/data-path.utils.js +56 -0
  29. package/dist/debug/path/derived/DerivedRegistry.cjs +1 -0
  30. package/dist/debug/path/derived/DerivedRegistry.js +157 -0
  31. package/dist/debug/path/derived/RaphDerivedHandle.cjs +1 -0
  32. package/dist/debug/path/derived/RaphDerivedHandle.js +125 -0
  33. package/dist/debug/path/derived/derived-collection.types.cjs +1 -0
  34. package/dist/debug/path/derived/derived-collection.types.js +1 -0
  35. package/dist/debug/path/derived/derived-collection.utils.cjs +1 -0
  36. package/dist/debug/path/derived/derived-collection.utils.js +179 -0
  37. package/dist/debug/path/derived/derived-strategy.types.cjs +1 -0
  38. package/dist/debug/path/derived/derived-strategy.types.js +1 -0
  39. package/dist/debug/path/derived/derived-strategy.utils.cjs +1 -0
  40. package/dist/debug/path/derived/derived-strategy.utils.js +20 -0
  41. package/dist/debug/path/meta/MetaController.cjs +1 -0
  42. package/dist/debug/path/meta/MetaController.js +214 -0
  43. package/dist/debug/path/meta/RaphMeta.cjs +1 -0
  44. package/dist/debug/path/meta/RaphMeta.js +68 -0
  45. package/dist/debug/path/meta/RaphMetaStore.cjs +1 -0
  46. package/dist/debug/path/meta/RaphMetaStore.js +184 -0
  47. package/dist/debug/path/meta/meta.types.cjs +1 -0
  48. package/dist/debug/path/meta/meta.types.js +1 -0
  49. package/dist/debug/path/path.types.cjs +1 -0
  50. package/dist/debug/path/path.types.js +1 -0
  51. package/dist/debug/path/pathSegmentKey.cjs +1 -0
  52. package/dist/debug/path/pathSegmentKey.js +12 -0
  53. package/dist/debug/path/storage/AdapterPathStore.cjs +1 -0
  54. package/dist/debug/path/storage/AdapterPathStore.js +133 -0
  55. package/dist/debug/path/storage/DefaultDataAdapter.cjs +1 -0
  56. package/dist/debug/path/storage/DefaultDataAdapter.js +356 -0
  57. package/dist/debug/path/storage/PathEventHub.cjs +1 -0
  58. package/dist/debug/path/storage/PathEventHub.js +148 -0
  59. package/dist/debug/path/storage/PathStore.cjs +1 -0
  60. package/dist/debug/path/storage/PathStore.js +326 -0
  61. package/dist/debug/path/storage/createDataDraft.cjs +1 -0
  62. package/dist/debug/path/storage/createDataDraft.js +71 -0
  63. package/dist/debug/path/storage/data-adapter.types.cjs +1 -0
  64. package/dist/debug/path/storage/data-adapter.types.js +1 -0
  65. package/dist/debug/reactivity/engine.cjs +1 -0
  66. package/dist/debug/reactivity/engine.js +1305 -0
  67. package/dist/debug/reactivity/reactive-object.cjs +1 -0
  68. package/dist/debug/reactivity/reactive-object.js +280 -0
  69. package/dist/debug/reactivity/scope.cjs +1 -0
  70. package/dist/debug/reactivity/scope.js +274 -0
  71. package/dist/debug/reactivity/types.cjs +1 -0
  72. package/dist/debug/reactivity/types.js +1 -0
  73. package/dist/debug/reactivity/watch.cjs +1 -0
  74. package/dist/debug/reactivity/watch.js +64 -0
  75. package/dist/debug/runtime/RaphRuntime.cjs +1 -0
  76. package/dist/debug/runtime/RaphRuntime.js +979 -0
  77. package/dist/debug/runtime/diagnostics/RaphDebug.cjs +1 -0
  78. package/dist/debug/runtime/diagnostics/RaphDebug.js +297 -0
  79. package/dist/debug/runtime/errors.cjs +1 -0
  80. package/dist/debug/runtime/errors.js +15 -0
  81. package/dist/debug/runtime/ownership/RaphEffectScope.cjs +1 -0
  82. package/dist/debug/runtime/ownership/RaphEffectScope.js +171 -0
  83. package/dist/debug/runtime/ownership/RaphNode.cjs +1 -0
  84. package/dist/debug/runtime/ownership/RaphNode.js +206 -0
  85. package/dist/debug/runtime/ownership/RaphScope.cjs +1 -0
  86. package/dist/debug/runtime/ownership/RaphScope.js +101 -0
  87. package/dist/debug/runtime/ownership/parent-graph.types.cjs +1 -0
  88. package/dist/debug/runtime/ownership/parent-graph.types.js +1 -0
  89. package/dist/debug/runtime/ownership/parentGraph.cjs +1 -0
  90. package/dist/debug/runtime/ownership/parentGraph.js +10 -0
  91. package/dist/debug/runtime/ownership/throwDisposalErrors.cjs +1 -0
  92. package/dist/debug/runtime/ownership/throwDisposalErrors.js +9 -0
  93. package/dist/debug/runtime/phases/RaphFrameLoop.cjs +1 -0
  94. package/dist/debug/runtime/phases/RaphFrameLoop.js +106 -0
  95. package/dist/debug/runtime/phases/RaphPhasePipeline.cjs +1 -0
  96. package/dist/debug/runtime/phases/RaphPhasePipeline.js +587 -0
  97. package/dist/debug/runtime/phases/orderPhaseTasks.cjs +1 -0
  98. package/dist/debug/runtime/phases/orderPhaseTasks.js +59 -0
  99. package/dist/debug/runtime/phases/phase.types.cjs +1 -0
  100. package/dist/debug/runtime/phases/phase.types.js +8 -0
  101. package/dist/debug/runtime/reactivity/PathHandle.cjs +1 -0
  102. package/dist/debug/runtime/reactivity/PathHandle.js +175 -0
  103. package/dist/debug/runtime/reactivity/RaphMetaSource.cjs +1 -0
  104. package/dist/debug/runtime/reactivity/RaphMetaSource.js +112 -0
  105. package/dist/debug/runtime/reactivity/RaphWorkGraph.cjs +1 -0
  106. package/dist/debug/runtime/reactivity/RaphWorkGraph.js +995 -0
  107. package/dist/debug/runtime/reactivity/RuntimeReactivity.cjs +1 -0
  108. package/dist/debug/runtime/reactivity/RuntimeReactivity.js +156 -0
  109. package/dist/debug/runtime/reactivity/RuntimeWatch.cjs +1 -0
  110. package/dist/debug/runtime/reactivity/RuntimeWatch.js +88 -0
  111. package/dist/debug/runtime/reactivity/runtime-reactivity.types.cjs +1 -0
  112. package/dist/debug/runtime/reactivity/runtime-reactivity.types.js +1 -0
  113. package/dist/entrypoints/machine-testing.d.ts +2 -0
  114. package/dist/entrypoints/machine.d.ts +5 -0
  115. package/dist/entrypoints/path.d.ts +14 -0
  116. package/dist/entrypoints/reactivity.d.ts +1 -0
  117. package/dist/entrypoints/runtime.d.ts +17 -0
  118. package/dist/index.cjs +1 -0
  119. package/dist/index.js +48 -0
  120. package/dist/machine/compiler.d.ts +71 -0
  121. package/dist/machine/core.d.ts +50 -0
  122. package/dist/machine/persistence.d.ts +5 -0
  123. package/dist/machine/runtime.d.ts +4 -0
  124. package/dist/machine/testing.d.ts +43 -0
  125. package/dist/machine/types.d.ts +155 -0
  126. package/dist/machine-testing.cjs +1 -0
  127. package/dist/machine-testing.js +188 -0
  128. package/dist/machine.cjs +1 -0
  129. package/dist/machine.js +837 -0
  130. package/dist/main.d.ts +20 -0
  131. package/dist/path/DataPath.d.ts +73 -0
  132. package/dist/path/PathRouter.d.ts +21 -0
  133. package/dist/path/RaphKernel.d.ts +169 -0
  134. package/dist/path/data-path.types.d.ts +34 -0
  135. package/dist/path/data-path.utils.d.ts +9 -0
  136. package/dist/path/derived/DerivedRegistry.d.ts +67 -0
  137. package/dist/path/derived/RaphDerivedHandle.d.ts +97 -0
  138. package/dist/path/derived/derived-collection.types.d.ts +12 -0
  139. package/dist/path/derived/derived-collection.utils.d.ts +20 -0
  140. package/dist/path/derived/derived-strategy.types.d.ts +12 -0
  141. package/dist/path/derived/derived-strategy.utils.d.ts +4 -0
  142. package/dist/path/meta/MetaController.d.ts +85 -0
  143. package/dist/path/meta/RaphMeta.d.ts +45 -0
  144. package/dist/path/meta/RaphMetaStore.d.ts +45 -0
  145. package/dist/path/meta/meta.types.d.ts +31 -0
  146. package/dist/path/path.types.d.ts +27 -0
  147. package/dist/path/pathSegmentKey.d.ts +2 -0
  148. package/dist/path/storage/AdapterPathStore.d.ts +45 -0
  149. package/dist/path/storage/DefaultDataAdapter.d.ts +63 -0
  150. package/dist/path/storage/PathEventHub.d.ts +48 -0
  151. package/dist/path/storage/PathStore.d.ts +51 -0
  152. package/dist/path/storage/createDataDraft.d.ts +4 -0
  153. package/dist/path/storage/data-adapter.types.d.ts +17 -0
  154. package/dist/path.cjs +1 -0
  155. package/dist/path.js +18 -0
  156. package/dist/raph.cjs +1 -0
  157. package/dist/raph.js +48 -0
  158. package/dist/reactivity/engine.d.ts +393 -0
  159. package/dist/reactivity/reactive-object.d.ts +36 -0
  160. package/dist/reactivity/scope.d.ts +146 -0
  161. package/dist/reactivity/types.d.ts +175 -0
  162. package/dist/reactivity/watch.d.ts +15 -0
  163. package/dist/reactivity.cjs +1 -0
  164. package/dist/reactivity.js +14 -0
  165. package/dist/runtime/RaphRuntime.d.ts +225 -0
  166. package/dist/runtime/diagnostics/RaphDebug.d.ts +239 -0
  167. package/dist/runtime/errors.d.ts +21 -0
  168. package/dist/runtime/ownership/RaphEffectScope.d.ts +29 -0
  169. package/dist/runtime/ownership/RaphNode.d.ts +40 -0
  170. package/dist/runtime/ownership/RaphScope.d.ts +38 -0
  171. package/dist/runtime/ownership/parent-graph.types.d.ts +4 -0
  172. package/dist/runtime/ownership/parentGraph.d.ts +3 -0
  173. package/dist/runtime/ownership/throwDisposalErrors.d.ts +1 -0
  174. package/dist/runtime/phases/RaphFrameLoop.d.ts +51 -0
  175. package/dist/runtime/phases/RaphPhasePipeline.d.ts +79 -0
  176. package/dist/runtime/phases/orderPhaseTasks.d.ts +6 -0
  177. package/dist/runtime/phases/phase.types.d.ts +92 -0
  178. package/dist/runtime/reactivity/PathHandle.d.ts +80 -0
  179. package/dist/runtime/reactivity/RaphMetaSource.d.ts +32 -0
  180. package/dist/runtime/reactivity/RaphWorkGraph.d.ts +171 -0
  181. package/dist/runtime/reactivity/RuntimeReactivity.d.ts +45 -0
  182. package/dist/runtime/reactivity/RuntimeWatch.d.ts +34 -0
  183. package/dist/runtime/reactivity/runtime-reactivity.types.d.ts +11 -0
  184. package/dist/runtime.cjs +1 -0
  185. package/dist/runtime.js +23 -0
  186. package/package.json +141 -0
@@ -0,0 +1,1305 @@
1
+ var P = Object.defineProperty;
2
+ var B = (c, e, t) => e in c ? P(c, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[e] = t;
3
+ var D = (c, e, t) => B(c, typeof e != "symbol" ? e + "" : e, t);
4
+ import { reactiveObject as G } from "./reactive-object.js";
5
+ import { appendScopeChild as z, ScopeNode as M, throwScopeErrors as F, detachScopeChild as K } from "./scope.js";
6
+ import { watchWithReactivity as Y } from "./watch.js";
7
+ const w = 1, d = 2, C = 4, S = 8, T = 16, y = 32, x = 64, W = 128, m = 256, v = 512, E = w | d, R = 16, X = 2;
8
+ function N(c) {
9
+ c.dependencyLookupDebt === void 0 && c.dependencyIndex === void 0 || (c.dependencyIndex = void 0, c.dependencyLookupDebt = void 0, c.dependencyLookupSearches = void 0);
10
+ }
11
+ function q(c, e) {
12
+ if (e <= R || c.flags & W || c.dependencyIndex !== void 0)
13
+ return;
14
+ const t = (c.dependencyLookupSearches ?? 0) + 1, i = (c.dependencyLookupDebt ?? 0) + e;
15
+ if (c.dependencyLookupSearches = t, c.dependencyLookupDebt = i, t < X || i < c.depCount)
16
+ return;
17
+ const s = /* @__PURE__ */ new Map();
18
+ for (let n = c.firstDep; n !== null; n = n.nextDep)
19
+ s.set(n.dep, n);
20
+ c.dependencyIndex = s, c.dependencyLookupDebt = void 0, c.dependencyLookupSearches = void 0;
21
+ }
22
+ function j(c, e, t) {
23
+ var l;
24
+ const i = c.firstSub;
25
+ if (i === null)
26
+ return;
27
+ if (i === c.lastSub)
28
+ return i.sub === e ? i : void 0;
29
+ const s = c.subSearchCursor ?? i;
30
+ let n = 1;
31
+ if (s.sub === e)
32
+ return c.subSearchCursor = s.nextSub ?? i, s;
33
+ if (t) {
34
+ const r = (l = e.dependencyIndex) == null ? void 0 : l.get(c);
35
+ if (r !== void 0)
36
+ return c.subSearchCursor = r.nextSub ?? i, r;
37
+ if (e.dependencyIndex !== void 0)
38
+ return;
39
+ }
40
+ let a = s.nextSub ?? i;
41
+ for (; a !== s; ) {
42
+ if (++n, a.sub === e)
43
+ return c.subSearchCursor = a.nextSub ?? i, t && q(e, n), a;
44
+ a = a.nextSub ?? i;
45
+ }
46
+ t && q(e, n);
47
+ }
48
+ class U {
49
+ /**
50
+ * Выбирает политику исполнения и сохраняет совместимость извлечённых методов.
51
+ * Тела методов находятся на прототипе; bind() выполняется только при создании
52
+ * экземпляра, чтобы Runtime и глобальный API могли передавать методы как callbacks.
53
+ * @param options Необязательная внешняя политика эффектов.
54
+ */
55
+ constructor(e = {}) {
56
+ // Opt-in стратегия длинного slow path; не добавляет policy field каждой ноде.
57
+ D(this, "adaptiveDependencyIndex");
58
+ // Потребитель текущего синхронного чтения; null отключает отслеживание.
59
+ D(this, "activeSub", null);
60
+ // Глубина вложенных синхронных границ группировки.
61
+ D(this, "batchDepth", 0);
62
+ // Индекс следующего элемента внутренней очереди эффектов.
63
+ D(this, "effectReadIndex", 0);
64
+ // Позиция добавления элемента в текущем проходе очереди.
65
+ D(this, "effectWriteIndex", 0);
66
+ // Граница активного префикса переиспользуемого стека invalidation.
67
+ D(this, "invalidationDepth", 0);
68
+ // Граница активного префикса стека проверки зависимостей.
69
+ D(this, "dependencyDepth", 0);
70
+ // Защита внутренней очереди от вложенного повторного прохода.
71
+ D(this, "flushingEffects", !1);
72
+ // Переиспользуемый буфер очереди; прочитанная ячейка сразу освобождает ссылку.
73
+ D(this, "effectQueue", new Array(16).fill(void 0));
74
+ // Переиспользуемый стек распространения invalidation; исходный способ выделения сохранён.
75
+ D(this, "invalidationStack", new Array(512).fill(null));
76
+ // Переиспользуемый стек проверки зависимостей с защитой активного вложенного префикса.
77
+ D(this, "dependencyStack", []);
78
+ // Общие адаптеры receiver для handles этого экземпляра.
79
+ // Создаются один раз, чтобы computed не хранил дополнительную ссылку на движок
80
+ // и не выделял отдельные get/peek closures на каждый источник.
81
+ D(this, "handleReaders", this.createHandleReaders());
82
+ // Выбранная внешняя политика; у синхронного экземпляра отсутствует.
83
+ D(this, "effectScheduler");
84
+ // Прямой обработчик очереди, выбранный один раз при создании экземпляра.
85
+ D(this, "flushEffects");
86
+ /**
87
+ * Синхронная регистрация эффекта для Runtime и watch независимо от внешней политики.
88
+ * Это связанная ссылка на реализацию effect(), а не делегирующая функция.
89
+ * @internal
90
+ */
91
+ D(this, "_effectImmediate");
92
+ this.adaptiveDependencyIndex = e.adaptiveDependencyIndex ?? !1, this.effectScheduler = e.effectScheduler, this._effectImmediate = this.effect.bind(this), this.signal = this.signal.bind(this), this.computed = this.computed.bind(this), this.reactive = this.reactive.bind(this), this.watch = this.watch.bind(this), this.batch = this.batch.bind(this), this.untracked = this.untracked.bind(this), this.scope = this.scope.bind(this), this._signalAccess = this._signalAccess.bind(this), this._computedAccess = this._computedAccess.bind(this), this._ownedSignal = this._ownedSignal.bind(this), this._ownedComputed = this._ownedComputed.bind(this), this._isTracking = this._isTracking.bind(this), this._isFlushingEffects = this._isFlushingEffects.bind(this), this._startBatch = this._startBatch.bind(this), this._endBatch = this._endBatch.bind(this), this.effect = this.effectScheduler === void 0 ? this._effectImmediate : this.createScheduledEffect.bind(this), this.flushEffects = this.effectScheduler === void 0 ? this.flushSyncEffects : this.flushExternalEffects;
93
+ }
94
+ // ---------------------------------------------
95
+ // PUBLIC API
96
+ // ---------------------------------------------
97
+ /**
98
+ * Создаёт объектный signal с get/peek/set.
99
+ * get() регистрирует зависимость только при активном потребителе,
100
+ * а peek() выполняет чтение с временно отключённым отслеживанием.
101
+ */
102
+ signal(e) {
103
+ let t = e, i;
104
+ const s = () => {
105
+ const a = i;
106
+ if (a !== void 0)
107
+ return this.readSignalValue(a);
108
+ const l = this.activeSub;
109
+ return l === null || (i = this.materializeSignal(
110
+ t,
111
+ l
112
+ )), t;
113
+ }, n = (a) => {
114
+ const l = i;
115
+ if (l !== void 0) {
116
+ this.writeSignalValue(l, a);
117
+ return;
118
+ }
119
+ t !== a && (t = a);
120
+ };
121
+ return {
122
+ get: s,
123
+ peek: this.handleReaders.peek,
124
+ set: n
125
+ };
126
+ }
127
+ /**
128
+ * Возвращает стабильный глубокий Proxy для plain object или array.
129
+ * Object context и per-property sources создаются лениво внутри этого engine.
130
+ */
131
+ reactive(e) {
132
+ return G(this, e, () => this.createReactivePropertySourceBridge());
133
+ }
134
+ computed(e) {
135
+ if (typeof e == "function")
136
+ return this.createComputedHandle(e);
137
+ const t = this.createComputedHandle(e.get);
138
+ return t.set = e.set, t;
139
+ }
140
+ /**
141
+ * Создаёт эффект согласно политике экземпляра и возвращает disposer.
142
+ * Прототип содержит синхронную реализацию; при наличии scheduler конструктор
143
+ * подставляет createScheduledEffect, сохраняя этот путь как _effectImmediate.
144
+ * Вложенный эффект включается в список ресурсов активного эффекта.
145
+ * При ошибке регистрации удаляет созданные ресурсы, сохраняя обе причины сбоя.
146
+ * @param fn Синхронное тело с необязательным cleanup очередного запуска.
147
+ * @param onStop Однократная окончательная очистка, независимая от повторных запусков.
148
+ */
149
+ effect(e, t) {
150
+ const i = this.allocateGraphRecord(void 0, e, d | w | y);
151
+ t !== void 0 && (i.onStop = t);
152
+ const s = this.activeSub;
153
+ s !== null && s.flags & y && z(s, i);
154
+ try {
155
+ this.executeEffect(i);
156
+ } catch (n) {
157
+ try {
158
+ this.disposeEffect(i);
159
+ } catch (a) {
160
+ throw new AggregateError([n, a], "Effect registration and cleanup failed.");
161
+ }
162
+ throw n;
163
+ }
164
+ return this.effectReadIndex !== this.effectWriteIndex && this.flushEffects(), () => this.disposeEffect(i);
165
+ }
166
+ /**
167
+ * Наблюдает за источниками; callback и cleanup не создают зависимостей.
168
+ */
169
+ watch(e, t, i) {
170
+ return Y(this.effect, this.untracked, e, t, i);
171
+ }
172
+ /**
173
+ * Группирует синхронные записи и обрабатывает эффекты после внешней границы.
174
+ * Возвращает результат операции. Если тело и очередь завершаются с ошибками,
175
+ * передаёт обе ошибки в AggregateError вместо потери первой. Не является откатом данных.
176
+ */
177
+ batch(e) {
178
+ ++this.batchDepth;
179
+ let t;
180
+ try {
181
+ t = e();
182
+ } catch (i) {
183
+ if (!--this.batchDepth && this.effectReadIndex !== this.effectWriteIndex)
184
+ try {
185
+ this.flushEffects();
186
+ } catch (s) {
187
+ throw new AggregateError(
188
+ [i, s],
189
+ "Batch operation and effect queue processing failed."
190
+ );
191
+ }
192
+ throw i;
193
+ }
194
+ return !--this.batchDepth && this.effectReadIndex !== this.effectWriteIndex && this.flushEffects(), t;
195
+ }
196
+ /**
197
+ * Выполняет синхронную операцию без добавления зависимостей текущему потребителю.
198
+ * Восстанавливает прежний контекст и при исключении. Асинхронное продолжение
199
+ * операции этим контекстом не охватывается.
200
+ */
201
+ untracked(e) {
202
+ if (this.activeSub === null)
203
+ return e();
204
+ const t = this.activeSub;
205
+ this.activeSub = null;
206
+ try {
207
+ return e();
208
+ } finally {
209
+ this.activeSub = t;
210
+ }
211
+ }
212
+ /**
213
+ * Создаёт владельца ресурсов в текущем графе без Runtime и фаз.
214
+ */
215
+ scope() {
216
+ return new M(this);
217
+ }
218
+ // ---------------------------------------------
219
+ // PRIVATE
220
+ // ---------------------------------------------
221
+ /**
222
+ * Создаёт запись графа с одинаковым порядком основных полей.
223
+ * Значение служит кешем signal/computed либо хранит cleanup эффекта.
224
+ * Поля внешней задачи и окончательной очистки добавляются только при необходимости.
225
+ */
226
+ allocateGraphRecord(e, t, i) {
227
+ return {
228
+ flags: i,
229
+ firstSub: null,
230
+ lastSub: null,
231
+ firstDep: null,
232
+ tailDep: null,
233
+ depCount: 0,
234
+ evaluate: t,
235
+ cachedValue: e
236
+ };
237
+ }
238
+ /** Creates a narrow Proxy adapter over the existing intrusive graph. */
239
+ createReactivePropertySourceBridge() {
240
+ return {
241
+ batch: this.batch,
242
+ create: () => {
243
+ if (this.activeSub === null)
244
+ throw new Error("[Raph] Reactive property source requires a tracked read.");
245
+ return { firstSub: null, lastSub: null };
246
+ },
247
+ isTracking: this._isTracking,
248
+ track: (e) => {
249
+ const t = this.activeSub;
250
+ t !== null && this.trackDependency(e, t);
251
+ },
252
+ trigger: (e) => {
253
+ const t = e.firstSub;
254
+ t !== null && (this.propagateInvalidation(t), !this.batchDepth && this.effectReadIndex !== this.effectWriteIndex && this.flushEffects());
255
+ }
256
+ };
257
+ }
258
+ /**
259
+ * Материализует signal в графе при первом отслеживаемом чтении
260
+ * и связывает его с активным потребителем.
261
+ *
262
+ * До этого момента signal может хранить значение только в замыкании
263
+ * и вообще не создавать `ReactiveNode`.
264
+ */
265
+ materializeSignal(e, t, i) {
266
+ const s = this.allocateGraphRecord(
267
+ e,
268
+ void 0,
269
+ 0
270
+ );
271
+ return i !== void 0 && (s.sourceHooks = i, s.flags |= v), t.flags & W ? this.appendInitialDependency(s, t) : this.trackDependency(s, t), s;
272
+ }
273
+ /**
274
+ * Создаёт минимальный handle computed без преждевременного выделения полей графа.
275
+ * Первый get() материализует запись на этом же объекте и заменяет метод чтения.
276
+ */
277
+ createComputedHandle(e, t) {
278
+ const i = {
279
+ evaluate: e,
280
+ get: this.handleReaders.initializeComputed,
281
+ peek: this.handleReaders.peek
282
+ };
283
+ return t !== void 0 && (i.sourceHooks = t), i;
284
+ }
285
+ /**
286
+ * Создаёт эффект с одной постоянной задачей внешнего scheduler.
287
+ * Первый и последующие запуски проходят через задачу; устаревший runner после stop
288
+ * ничего не выполняет. При синхронной ошибке runner обрабатывает независимую очередь.
289
+ * @param fn Тело эффекта.
290
+ * @param onStop Однократная окончательная очистка.
291
+ */
292
+ createScheduledEffect(e, t) {
293
+ const i = this.allocateGraphRecord(void 0, e, d | w | y);
294
+ let s = !1;
295
+ t !== void 0 && (i.onStop = t);
296
+ const n = this.activeSub;
297
+ n !== null && n.flags & y && z(n, i);
298
+ const a = () => {
299
+ if (!(!(i.flags & x) || i.evaluate === void 0)) {
300
+ i.flags &= ~x, s = !0;
301
+ try {
302
+ this.executeEffect(i);
303
+ } catch (l) {
304
+ if (!this.batchDepth && this.effectReadIndex !== this.effectWriteIndex)
305
+ try {
306
+ this.flushEffects();
307
+ } catch (r) {
308
+ throw new AggregateError(
309
+ [l, r],
310
+ "Effect execution and queue processing failed."
311
+ );
312
+ }
313
+ throw l;
314
+ }
315
+ !this.batchDepth && this.effectReadIndex !== this.effectWriteIndex && this.flushEffects();
316
+ }
317
+ };
318
+ try {
319
+ const l = this.effectScheduler.bind(a);
320
+ l.cancelPending = () => i.evaluate === void 0 || !s ? !1 : (this.settleCancelledDependencies(i), i.flags &= ~(x | E | C), !this.batchDepth && this.effectReadIndex !== this.effectWriteIndex && this.flushEffects(), !0), l.rearmPending = () => {
321
+ i.evaluate !== void 0 && (i.flags |= d | x, l.schedule());
322
+ }, i.effectTask = l, this.requestEffectTask(i);
323
+ } catch (l) {
324
+ try {
325
+ this.disposeEffect(i);
326
+ } catch (r) {
327
+ throw new AggregateError([l, r], "Effect registration and cleanup failed.");
328
+ }
329
+ throw l;
330
+ }
331
+ return !this.batchDepth && this.effectReadIndex !== this.effectWriteIndex && this.flushEffects(), () => this.disposeEffect(i);
332
+ }
333
+ /**
334
+ * Регистрирует чтение signal и при необходимости фиксирует pending-значение.
335
+ * Текущая связь передаётся фиксации, чтобы не уведомлять читающего потребителя повторно.
336
+ */
337
+ readSignalValue(e) {
338
+ const t = this.activeSub;
339
+ let i = null;
340
+ return t !== null && (i = this.trackDependency(e, t)), e.flags & d && this.commitSignalValue(e, i), e.cachedValue;
341
+ }
342
+ /**
343
+ * Записывает новое значение или откладывает его фиксацию до чтения в batch.
344
+ * Сохраняет исходное сравнение через === и учёт автора pending-записи.
345
+ * Без batch и внешней политики очередь эффектов завершается до возврата из set().
346
+ */
347
+ writeSignalValue(e, t) {
348
+ if (e.flags & d || this.batchDepth) {
349
+ const s = !!(e.flags & d);
350
+ if ((e.flags & d ? e.pendingValue : e.cachedValue) === t)
351
+ return;
352
+ if (e.pendingValue = t, e.cachedValue === t)
353
+ e.flags &= ~d, e.pendingAuthor = void 0;
354
+ else {
355
+ e.flags |= d;
356
+ const l = this.activeSub !== null && this.activeSub.flags & S ? this.activeSub : null;
357
+ s ? e.pendingAuthor !== l && (e.pendingAuthor = null) : e.pendingAuthor = l;
358
+ }
359
+ const a = e.firstSub;
360
+ a != null && (!s || this.activeSub !== null && this.activeSub.flags & S || e.flags & v) && this.propagateInvalidation(a, !0);
361
+ return;
362
+ }
363
+ if (e.cachedValue === t)
364
+ return;
365
+ e.cachedValue = t;
366
+ const i = e.firstSub;
367
+ i != null && (this.propagateInvalidation(i), !this.batchDepth && this.effectReadIndex !== this.effectWriteIndex && this.flushEffects());
368
+ }
369
+ /**
370
+ * Возвращает кеш либо синхронно актуализирует вычисляемое значение.
371
+ * Неуспешное вычисление не считается значением. Даже ошибочное чтение сохраняет
372
+ * связь с активным потребителем, чтобы тот мог восстановиться при изменении источника.
373
+ */
374
+ readComputedValue(e) {
375
+ const t = e.flags, i = t & (T | E | m), s = i === 0 ? e.cachedValue : i & T ? this.evaluateFirstValue(e) : this.refreshComputedValue(e, t);
376
+ if (e.evaluate === void 0)
377
+ return s;
378
+ const n = this.activeSub;
379
+ if (n !== null) {
380
+ const a = n.tailDep;
381
+ n.flags & W ? (a === null || a.dep !== e) && this.appendInitialDependency(e, n) : this.trackDependency(e, n);
382
+ }
383
+ return s;
384
+ }
385
+ /**
386
+ * Выполняет первый сбор зависимостей и кеширует только успешный результат.
387
+ * При исключении оставляет состояние повторяемой ошибки, а не чистый undefined.
388
+ * Уже прочитанные зависимости сохраняются для последующего уведомления.
389
+ */
390
+ evaluateFirstValue(e) {
391
+ const t = e.flags & v, i = e.evaluate;
392
+ e.flags = t | S | W;
393
+ const s = this.activeSub;
394
+ this.activeSub = e;
395
+ try {
396
+ const n = i();
397
+ return e.evaluate !== i ? (e.cachedValue = void 0, e.flags = 0, n) : (e.cachedValue = n, e.flags = t | (e.flags & C ? d : 0), n);
398
+ } catch (n) {
399
+ throw e.evaluate !== i ? (e.cachedValue = void 0, e.flags = 0, n) : (e.flags = t | m, s !== null && this.trackDependency(e, s), n);
400
+ } finally {
401
+ this.activeSub = s;
402
+ }
403
+ }
404
+ /**
405
+ * Актуализирует computed: выполняет прямой пересчёт либо проверяет зависимости.
406
+ * После ошибки getter разрешён повторный пересчёт даже без новой записи источника.
407
+ */
408
+ refreshComputedValue(e, t, i = null) {
409
+ try {
410
+ if (t & (d | C | m))
411
+ return this.recomputeValue(e, i) || (e.flags &= ~E), e.cachedValue;
412
+ const s = e.firstDep;
413
+ return (s === null || !this.refreshDependencies(e, s) || !this.recomputeValue(e, i)) && (e.flags &= ~E), e.cachedValue;
414
+ } catch (s) {
415
+ throw this.activeSub !== null && this.trackDependency(e, this.activeSub), s;
416
+ }
417
+ }
418
+ /**
419
+ * Фиксирует pending-значение и уведомляет непосредственных потребителей.
420
+ * Пропускает указанную связь и автора записи, чтобы не дублировать текущую работу.
421
+ * @returns Изменилось ли зафиксированное значение.
422
+ */
423
+ commitSignalValue(e, t) {
424
+ const i = e.cachedValue;
425
+ e.cachedValue = e.pendingValue, e.flags &= ~d;
426
+ const s = e.pendingAuthor;
427
+ return e.pendingAuthor = void 0, i === e.cachedValue ? !1 : (e.firstSub !== null && this.confirmSubUpdates(e.firstSub, t, s ?? null), !0);
428
+ }
429
+ /**
430
+ * Обрабатывает чтение производителя активным потребителем.
431
+ * Сначала проверяет текущую и следующую связи; более дорогой поиск вынесен отдельно.
432
+ */
433
+ trackDependency(e, t) {
434
+ const i = t.tailDep;
435
+ if (i !== null) {
436
+ const n = i.nextDep;
437
+ return n !== null && n.dep === e ? (t.tailDep = n, n) : i.dep === e ? i : this.reconcileDependency(e, t, i, n);
438
+ }
439
+ const s = t.firstDep;
440
+ return s === null ? t.tailDep = this.insertDependency(e, t, null) : s.dep === e ? (t.tailDep = s, s) : this.reconcileDependency(e, t, null, s);
441
+ }
442
+ /**
443
+ * Согласует чтение с существующим списком зависимостей при несовпадении порядка.
444
+ * Использует ограниченный линейный поиск, затем поиск среди потребителей производителя.
445
+ * Существующую связь перемещает или переиспользует; новую создаёт только при необходимости.
446
+ */
447
+ reconcileDependency(e, t, i, s) {
448
+ if (t.depCount <= R) {
449
+ for (let r = s; r !== null; r = r.nextDep)
450
+ if (r.dep === e)
451
+ return this.reorderDependency(t, r, i), t.tailDep = r, r;
452
+ for (let r = i; r !== null; r = r.prevDep)
453
+ if (r.dep === e)
454
+ return r;
455
+ return s !== null ? (t.tailDep = this.reuseDepLink(s, e), s) : t.tailDep = this.insertDependency(e, t, i);
456
+ }
457
+ let n = 0, a = s;
458
+ for (; a !== null && n < R; ) {
459
+ const r = a;
460
+ if (r.dep === e)
461
+ return this.reorderDependency(t, r, i), t.tailDep = r, r;
462
+ a = r.nextDep, ++n;
463
+ }
464
+ let l = i;
465
+ for (; l !== null && n < R; ) {
466
+ const r = l;
467
+ if (r.dep === e)
468
+ return r;
469
+ l = r.prevDep, ++n;
470
+ }
471
+ if (a !== null || l !== null) {
472
+ const r = j(e, t, this.adaptiveDependencyIndex);
473
+ if (r !== void 0)
474
+ return this.reorderDependency(t, r, i), t.tailDep = r, r;
475
+ }
476
+ return s !== null ? (t.tailDep = this.reuseDepLink(s, e), s) : t.tailDep = this.insertDependency(e, t, i);
477
+ }
478
+ /**
479
+ * Добавляет связь при первоначальном сборе зависимостей.
480
+ * Предусловие: after является хвостом собранного префикса нового списка.
481
+ * Связь одновременно включается в список потребителей производителя.
482
+ */
483
+ appendInitialDependency(e, t) {
484
+ var a;
485
+ const i = t.tailDep, s = e.lastSub, n = {
486
+ dep: e,
487
+ sub: t,
488
+ prevSub: s,
489
+ nextSub: null,
490
+ prevDep: i,
491
+ nextDep: null
492
+ };
493
+ return s === null ? e.firstSub = n : s.nextSub = n, e.lastSub = n, i === null ? t.firstDep = n : i.nextDep = n, t.tailDep = n, ++t.depCount, (a = t.dependencyIndex) == null || a.set(e, n), e.flags & v && this.attachDependencyCleanup(n), n;
494
+ }
495
+ /**
496
+ * Вставляет связь после заданного курсора зависимостей потребителя.
497
+ * Сохраняет ещё не прочитанный хвост списка и увеличивает dependencyCount.
498
+ */
499
+ insertDependency(e, t, i) {
500
+ var l;
501
+ const s = e.lastSub, n = {
502
+ dep: e,
503
+ sub: t,
504
+ prevSub: s,
505
+ nextSub: null,
506
+ prevDep: i,
507
+ nextDep: null
508
+ };
509
+ s === null ? e.firstSub = n : s.nextSub = n, e.lastSub = n;
510
+ const a = i === null ? t.firstDep : i.nextDep;
511
+ return n.nextDep = a, a !== null && (a.prevDep = n), i === null ? t.firstDep = n : i.nextDep = n, ++t.depCount, (l = t.dependencyIndex) == null || l.set(e, n), e.flags & v && this.attachDependencyCleanup(n), n;
512
+ }
513
+ /**
514
+ * Переназначает существующую связь другому производителю.
515
+ * Положение в списке зависимостей потребителя и число его связей сохраняются.
516
+ */
517
+ reuseDepLink(e, t) {
518
+ const i = e.sub.dependencyIndex;
519
+ this.detachSubLink(e);
520
+ const s = t.lastSub;
521
+ return e.dep = t, e.prevSub = s, e.nextSub = null, s === null ? t.firstSub = e : s.nextSub = e, t.lastSub = e, i == null || i.set(t, e), t.flags & v && this.attachDependencyCleanup(e), e;
522
+ }
523
+ /**
524
+ * Перемещает существующую зависимость после курсора текущего чтения.
525
+ * Список потребителей производителя и количество зависимостей не изменяет.
526
+ */
527
+ reorderDependency(e, t, i) {
528
+ if (t.prevDep === i)
529
+ return;
530
+ const s = t.prevDep, n = t.nextDep;
531
+ s === null ? e.firstDep = n : s.nextDep = n, n !== null && (n.prevDep = s);
532
+ const a = i === null ? e.firstDep : i.nextDep;
533
+ t.prevDep = i, t.nextDep = a, a !== null && (a.prevDep = t), i === null ? e.firstDep = t : i.nextDep = t;
534
+ }
535
+ /**
536
+ * Удаляет непрочитанный хвост зависимостей завершившегося запуска.
537
+ * trackedTail обозначает границу прочитанного префикса, а не неизменный конец списка.
538
+ * Удаление из списков производителей не выполняет пользовательские callbacks.
539
+ */
540
+ pruneUnreadDependencies(e) {
541
+ const t = e.tailDep;
542
+ let i = t === null ? e.firstDep : t.nextDep;
543
+ if (i !== null) {
544
+ for (t === null ? e.firstDep = null : t.nextDep = null; i !== null; ) {
545
+ const s = i.nextDep;
546
+ this.detachSubLink(i), --e.depCount, i = s;
547
+ }
548
+ e.depCount <= R && N(e);
549
+ }
550
+ }
551
+ /**
552
+ * Удаляет связь только из списка потребителей производителя.
553
+ * Список зависимостей потребителя и его счётчик здесь не изменяются.
554
+ * Также исправляет курсор поиска, если он указывал на удаляемую связь.
555
+ */
556
+ detachSubLink(e) {
557
+ var t;
558
+ if ((t = e.sub.dependencyIndex) == null || t.delete(e.dep), e.dep.flags & v) {
559
+ const i = e.dependencyCleanup;
560
+ e.dependencyCleanup = void 0, i == null || i();
561
+ }
562
+ e.dep.subSearchCursor === e && (e.dep.subSearchCursor = e.nextSub ?? (e.dep.firstSub === e ? void 0 : e.dep.firstSub ?? void 0)), e.prevSub === null ? e.dep.firstSub = e.nextSub : e.prevSub.nextSub = e.nextSub, e.nextSub === null ? e.dep.lastSub = e.prevSub : e.nextSub.prevSub = e.prevSub;
563
+ }
564
+ /** Connects Runtime ownership metadata only for edges whose producer opted in. */
565
+ attachDependencyCleanup(e) {
566
+ var n, a;
567
+ const t = e.dep.sourceHooks, i = t == null ? void 0 : t.onDependency;
568
+ if (i === void 0)
569
+ return;
570
+ const s = ((n = e.sub.sourceHooks) == null ? void 0 : n.dependencyOwner) ?? ((a = e.sub.effectTask) == null ? void 0 : a.dependencyOwner);
571
+ s !== void 0 && (e.dependencyCleanup = i(s));
572
+ }
573
+ /**
574
+ * Отсоединяет owned-источник сразу с обеих сторон каждой связи.
575
+ * Вызывается на границе lifetime, а не при обычных чтениях и записях.
576
+ * Переводит ожидавших проверку потребителей к повторному вычислению при необходимости.
577
+ */
578
+ releaseSourceSubs(e) {
579
+ if (!(e.flags & v)) {
580
+ let i = e.firstSub;
581
+ for (; i != null; ) {
582
+ const s = i.nextSub, n = i.sub;
583
+ this.detachDependencyLink(i), this.detachSubLink(i);
584
+ const a = n.flags;
585
+ (a & (E | S)) === w && (n.flags = a & ~w | d, a & y && this.enqueueEffect(n, e)), i = s;
586
+ }
587
+ e.firstSub = e.lastSub = null, e.subSearchCursor = void 0;
588
+ return;
589
+ }
590
+ let t = e.firstSub;
591
+ for (; t != null; ) {
592
+ const i = t.nextSub;
593
+ this.detachDependencyLink(t), this.detachSubLink(t), t = i;
594
+ }
595
+ e.firstSub = e.lastSub = null, e.subSearchCursor = void 0;
596
+ }
597
+ /**
598
+ * Удаляет связь только из списка зависимостей потребителя.
599
+ * Исправляет курсор прочитанного префикса и dependencyCount; список производителя
600
+ * должен быть обновлён отдельной операцией.
601
+ */
602
+ detachDependencyLink(e) {
603
+ const t = e.sub, i = e.prevDep, s = e.nextDep;
604
+ i === null ? t.firstDep = s : i.nextDep = s, s !== null && (s.prevDep = i), t.tailDep === e && (t.tailDep = i), --t.depCount, t.depCount <= R && N(t);
605
+ }
606
+ /**
607
+ * Добавляет эффект во внутреннюю очередь один раз до обработки текущей записи.
608
+ * Флаг SCHEDULED предотвращает повторное добавление без создания task-объекта.
609
+ */
610
+ enqueueEffect(e, t) {
611
+ var s, n;
612
+ const i = t !== void 0 && t.flags & v ? t.sourceHooks.token : void 0;
613
+ i !== void 0 && ((n = (s = e.effectTask) == null ? void 0 : s.notify) == null || n.call(s, i)), !(e.flags & x) && (e.flags |= x, this.effectQueue[this.effectWriteIndex] = e, ++this.effectWriteIndex);
614
+ }
615
+ /**
616
+ * Распространяет invalidation от непосредственных к транзитивным потребителям.
617
+ * Сохраняет исходный итеративный обход с переиспользуемым стеком; callbacks
618
+ * не выполняет. Непосредственное и потенциальное изменения отмечает разными флагами.
619
+ */
620
+ propagateInvalidation(e, t = !1) {
621
+ var n, a, l, r, h, b, u, o, I, _, A, O, Q;
622
+ const i = this.invalidationDepth;
623
+ let s = i;
624
+ for (let p = e; p !== null; p = p.nextSub) {
625
+ const f = p.sub, g = f.flags;
626
+ let k = 0;
627
+ if (g & (E | S) ? g & S && (k = this.invalidateReadDependency(p, f, g)) : (k = g & ~C | (t ? w : d), f.flags = k), k === 0) {
628
+ if (g & y && g & x) {
629
+ const L = p.dep.flags & v ? p.dep.sourceHooks.token : void 0;
630
+ L !== void 0 && ((a = (n = f.effectTask) == null ? void 0 : n.notify) == null || a.call(n, L));
631
+ } else f.flags & v && ((r = (l = f.sourceHooks).onInvalidate) == null || r.call(l, f.firstSub !== null), f.firstSub !== null && (this.invalidationStack[s++] = f.firstSub));
632
+ continue;
633
+ }
634
+ k & y ? (!(k & S) || ((h = f.effectTask) == null ? void 0 : h.allowScheduleDuringRun) === !0) && this.enqueueEffect(f, p.dep) : (!(g & E) && f.flags & v && ((u = (b = f.sourceHooks).onInvalidate) == null || u.call(b, f.firstSub !== null)), f.firstSub !== null && (this.invalidationStack[s++] = f.firstSub));
635
+ }
636
+ for (; s !== i; ) {
637
+ let p = this.invalidationStack[--s];
638
+ do {
639
+ const f = p.sub, g = f.flags;
640
+ let k = 0;
641
+ if (g & (E | S) ? g & S && (k = this.invalidateReadDependency(p, f, g)) : (k = g & ~C | w, f.flags = k), k === 0) {
642
+ if (g & y && g & x) {
643
+ const L = p.dep.flags & v ? p.dep.sourceHooks.token : void 0;
644
+ L !== void 0 && ((I = (o = f.effectTask) == null ? void 0 : o.notify) == null || I.call(o, L));
645
+ } else if (f.flags & v && ((A = (_ = f.sourceHooks).onInvalidate) == null || A.call(_, f.firstSub !== null), f.firstSub !== null)) {
646
+ p.nextSub !== null && (this.invalidationStack[s++] = p.nextSub), p = f.firstSub;
647
+ continue;
648
+ }
649
+ } else if (k & y)
650
+ this.enqueueEffect(f, p.dep);
651
+ else if (!(g & E) && f.flags & v && ((Q = (O = f.sourceHooks).onInvalidate) == null || Q.call(O, f.firstSub !== null)), f.firstSub !== null) {
652
+ p.nextSub !== null && (this.invalidationStack[s++] = p.nextSub), p = f.firstSub;
653
+ continue;
654
+ }
655
+ p = p.nextSub;
656
+ } while (p !== null);
657
+ }
658
+ this.invalidationDepth = i;
659
+ }
660
+ /**
661
+ * Помечает работающего потребителя, только если затронута уже прочитанная связь.
662
+ * Связи за trackedTail принадлежат прошлому запуску и не означают повторную invalidation.
663
+ * @returns Новое состояние либо ноль, если уведомление не требуется.
664
+ */
665
+ invalidateReadDependency(e, t, i) {
666
+ const s = t.tailDep;
667
+ if (s === null)
668
+ return 0;
669
+ if (e !== s) {
670
+ for (let a = e.prevDep; a !== null; a = a.prevDep)
671
+ if (a === s)
672
+ return 0;
673
+ }
674
+ const n = i | C | w;
675
+ return t.flags = n, n;
676
+ }
677
+ /**
678
+ * Подтверждает необходимость пересчёта непосредственных потребителей.
679
+ * Применяется после фиксации реально изменившегося значения; позволяет исключить
680
+ * текущую связь и автора записи.
681
+ */
682
+ confirmSubUpdates(e, t, i = null) {
683
+ var s, n;
684
+ for (let a = e; a !== null; a = a.nextSub) {
685
+ if (a === t || a.sub === i)
686
+ continue;
687
+ const l = a.sub, r = l.flags;
688
+ r & d || (l.flags = r & ~w | d, r & y ? this.enqueueEffect(l, a.dep) : r & E || l.flags & v && ((n = (s = l.sourceHooks).onInvalidate) == null || n.call(s, l.firstSub !== null)));
689
+ }
690
+ }
691
+ /**
692
+ * Повторно вычисляет узел, согласует зависимости и сравнивает результат с кешем.
693
+ * При ошибке восстанавливает контекст, удаляет непрочитанный хвост и оставляет
694
+ * повторяемое состояние ошибки. Также восстанавливает непосредственного потребителя
695
+ * skipSub: при разворачивании стека его связь могла быть уже извлечена из буфера.
696
+ * Неверное значение в кеш не записывается.
697
+ */
698
+ recomputeValue(e, t = null) {
699
+ const i = e.evaluate;
700
+ e.tailDep = null;
701
+ const s = e.flags & ~C | S;
702
+ e.flags = s;
703
+ const n = this.activeSub;
704
+ this.activeSub = e;
705
+ let a;
706
+ try {
707
+ a = i();
708
+ } catch (u) {
709
+ throw e.evaluate !== i ? (e.cachedValue = void 0, e.flags = 0, u) : (this.restoreComputedFailure(e, t), u);
710
+ } finally {
711
+ this.activeSub = n;
712
+ }
713
+ if (e.evaluate !== i)
714
+ return e.cachedValue = void 0, e.flags = 0, !1;
715
+ const l = e.flags & C, r = s & -268, h = e.tailDep;
716
+ (h === null ? e.firstDep : h.nextDep) !== null && this.pruneUnreadDependencies(e);
717
+ const b = e.cachedValue;
718
+ return e.cachedValue = a, e.flags = s & v | (l ? d : r), b === a ? !1 : (e.firstSub !== null && this.confirmSubUpdates(e.firstSub, t), !0);
719
+ }
720
+ /**
721
+ * Восстанавливает связи и состояния после неудачного getter.
722
+ * Отдельная функция удерживает обработку исключений вне обычной части пересчёта.
723
+ * Потребитель исключаемой связи мог уже покинуть активный префикс стека.
724
+ */
725
+ restoreComputedFailure(e, t) {
726
+ e.flags = e.flags & -144 | m, this.pruneUnreadDependencies(e), t !== null && this.restoreFailedDependency(t.sub);
727
+ }
728
+ /**
729
+ * Итеративно проверяет зависимые computed и pending-сигналы перед запуском потребителя.
730
+ * Использует общий стек с сохранением активного префикса вложенного обхода.
731
+ * При исключении восстанавливает высоту стека и состояния всех незавершённых
732
+ * узлов текущего прохода; порядок успешного обхода не меняется.
733
+ */
734
+ refreshDependencies(e, t) {
735
+ const i = this.dependencyDepth;
736
+ try {
737
+ return this.walkDependencyChain(e, t);
738
+ } catch (s) {
739
+ this.restoreFailedDependency(e);
740
+ for (let n = i; n < this.dependencyDepth; n++)
741
+ this.restoreFailedDependency(this.dependencyStack[n].sub);
742
+ throw this.dependencyDepth = i, this.dependencyStack.length = i, s;
743
+ }
744
+ }
745
+ /** Settles every direct dependency so a cancelled external delivery can be re-armed. */
746
+ settleCancelledDependencies(e) {
747
+ for (let t = e.firstDep; t !== null; t = t.nextDep) {
748
+ const i = t.dep, s = i.flags;
749
+ s & (T | E | m) && (i.evaluate === void 0 ? s & d && this.commitSignalValue(i, t) : this.refreshComputedValue(i, s, t));
750
+ }
751
+ }
752
+ /**
753
+ * Выполняет исходный итеративный обход зависимостей без обработки ошибок внутри цикла.
754
+ * Перед пользовательским вычислением публикует активную высоту стека; оболочка
755
+ * refreshDependencies() использует этот префикс для восстановления после сбоя.
756
+ */
757
+ walkDependencyChain(e, t) {
758
+ const i = this.dependencyDepth;
759
+ let s = i, n = !1;
760
+ e: for (; ; ) {
761
+ if (e.flags & d)
762
+ n = !0;
763
+ else {
764
+ const a = t.dep, l = a.flags;
765
+ if (l & (d | m))
766
+ this.dependencyDepth = s, n = a.evaluate === void 0 ? this.commitSignalValue(a, t) : this.recomputeValue(a, t);
767
+ else if (l & w) {
768
+ if (a.firstDep !== null) {
769
+ this.dependencyStack[s++] = t, e = a, t = a.firstDep;
770
+ continue e;
771
+ }
772
+ this.dependencyDepth = s, n = this.recomputeValue(a, t);
773
+ } else
774
+ n = !1;
775
+ }
776
+ if (!n && t.nextDep !== null) {
777
+ t = t.nextDep;
778
+ continue;
779
+ }
780
+ if (n) {
781
+ for (; s !== i; ) {
782
+ this.dependencyDepth = --s;
783
+ const a = this.dependencyStack[s];
784
+ if (n = this.recomputeValue(e, a), e = a.sub, !n) {
785
+ if (a.nextDep !== null) {
786
+ t = a.nextDep;
787
+ continue e;
788
+ }
789
+ break;
790
+ }
791
+ }
792
+ if (n)
793
+ return this.dependencyDepth = i, !0;
794
+ }
795
+ for (; s !== i; ) {
796
+ this.dependencyDepth = --s;
797
+ const a = this.dependencyStack[s];
798
+ if (e.flags &= ~w, e = a.sub, a.nextDep !== null) {
799
+ t = a.nextDep;
800
+ continue e;
801
+ }
802
+ }
803
+ return e.flags &= ~w, this.dependencyDepth = i, !1;
804
+ }
805
+ }
806
+ /**
807
+ * Восстанавливает незавершённую запись после прерванной проверки зависимостей.
808
+ * Computed получает повторяемое состояние ошибки, effect остаётся доступным
809
+ * для следующей invalidation. Вызывается только на ошибочном пути.
810
+ */
811
+ restoreFailedDependency(e) {
812
+ e.flags &= -16, e.flags & y || (e.flags |= m);
813
+ }
814
+ /**
815
+ * Проверяет необходимость запуска, очищает прошлые ресурсы и выполняет тело эффекта.
816
+ * Ошибка cleanup останавливает эффект до создания ресурсов следующего запуска.
817
+ * При ошибке тела сохраняет фактически прочитанные зависимости, останавливает
818
+ * созданных детей и разрешает повторный запуск после следующей записи.
819
+ * Cleanup, возвращённый после собственного stop, освобождается сразу.
820
+ */
821
+ executeEffect(e) {
822
+ const t = e.flags;
823
+ if (!(t & E))
824
+ return;
825
+ if (!(t & (d | C))) {
826
+ const h = e.firstDep;
827
+ try {
828
+ if (h === null || !this.refreshDependencies(e, h)) {
829
+ e.flags &= ~E;
830
+ return;
831
+ }
832
+ } catch (b) {
833
+ throw e.flags &= -80, b;
834
+ }
835
+ }
836
+ const i = e.evaluate;
837
+ if (i === void 0) {
838
+ e.flags &= ~E;
839
+ return;
840
+ }
841
+ let s;
842
+ if (e.scopeLastChild !== void 0)
843
+ try {
844
+ this.disposeNestedEffects(e);
845
+ } catch (h) {
846
+ s = [h];
847
+ }
848
+ const n = typeof e.cachedValue == "function" ? e.cachedValue : void 0;
849
+ if (e.cachedValue = void 0, e.flags &= ~C, n !== void 0)
850
+ try {
851
+ this.untracked(n);
852
+ } catch (h) {
853
+ s ?? (s = []), s.push(h);
854
+ }
855
+ if (s !== void 0) {
856
+ try {
857
+ this.disposeEffect(e);
858
+ } catch (h) {
859
+ s.push(h);
860
+ }
861
+ F(s, "Effect cleanup failed.");
862
+ }
863
+ if (e.evaluate === void 0)
864
+ return;
865
+ e.tailDep = null, e.flags = e.flags & ~C | S;
866
+ const a = this.activeSub;
867
+ this.activeSub = e;
868
+ let l;
869
+ try {
870
+ l = i();
871
+ } catch (h) {
872
+ this.activeSub = a, e.flags &= ~S, this.failEffectRun(e, h, s);
873
+ } finally {
874
+ this.activeSub = a, e.flags &= ~S;
875
+ }
876
+ const r = e.tailDep;
877
+ if ((r === null ? e.firstDep : r.nextDep) !== null && this.pruneUnreadDependencies(e), typeof l == "function")
878
+ if (e.evaluate === void 0)
879
+ try {
880
+ this.untracked(l);
881
+ } catch (h) {
882
+ s ?? (s = []), s.push(h);
883
+ }
884
+ else
885
+ e.cachedValue = l;
886
+ e.flags & x ? e.flags = e.flags & -7 | w : e.flags &= -8;
887
+ }
888
+ /**
889
+ * Завершает неудачный запуск эффекта, не затрагивая успешный путь исполнения.
890
+ * Сохраняет прочитанные зависимости для следующей invalidation, освобождает
891
+ * детей неудачного запуска и объединяет ошибки с предыдущими ошибками cleanup.
892
+ */
893
+ failEffectRun(e, t, i) {
894
+ const s = i ?? [];
895
+ s.push(t), this.pruneUnreadDependencies(e);
896
+ try {
897
+ this.disposeNestedEffects(e);
898
+ } catch (n) {
899
+ s.push(n);
900
+ }
901
+ throw e.flags &= -72, s.length === 1 ? s[0] : new AggregateError(s, "Effect execution failed.");
902
+ }
903
+ /**
904
+ * Обрабатывает синхронную очередь до исчерпания, включая добавленную во время прохода работу.
905
+ * Ошибки отдельных эффектов не блокируют соседей и передаются после обработки.
906
+ * Путь не проверяет наличие внешней задачи у каждого узла.
907
+ */
908
+ flushSyncEffects() {
909
+ if (!(this.flushingEffects || this.activeSub !== null && (this.activeSub.flags & (y | S)) === (y | S))) {
910
+ this.flushingEffects = !0;
911
+ try {
912
+ for (; this.effectReadIndex !== this.effectWriteIndex; ) {
913
+ const e = this.effectReadIndex, t = this.effectQueue[e];
914
+ this.effectQueue[e] = void 0, ++this.effectReadIndex, t.flags &= ~x, this.executeEffect(t);
915
+ }
916
+ } catch (e) {
917
+ this.drainQueueAfterError(e, !1);
918
+ } finally {
919
+ this.effectReadIndex = 0, this.effectWriteIndex = 0, this.flushingEffects = !1;
920
+ }
921
+ }
922
+ }
923
+ /**
924
+ * Обрабатывает очередь экземпляра с внешней политикой выполнения.
925
+ * Обычные внутренние эффекты выполняет сразу, остальные передаёт постоянной задаче.
926
+ * Ошибка одного элемента не оставляет необработанные записи со старым SCHEDULED.
927
+ */
928
+ flushExternalEffects() {
929
+ if (!(this.flushingEffects || this.activeSub !== null && (this.activeSub.flags & (y | S)) === (y | S))) {
930
+ this.flushingEffects = !0;
931
+ try {
932
+ for (; this.effectReadIndex !== this.effectWriteIndex; ) {
933
+ const e = this.effectReadIndex, t = this.effectQueue[e];
934
+ this.effectQueue[e] = void 0, ++this.effectReadIndex;
935
+ const i = t.effectTask;
936
+ i === void 0 ? (t.flags &= ~x, this.executeEffect(t)) : t.evaluate !== void 0 ? this.scheduleEffectTask(t, i) : t.flags &= ~x;
937
+ }
938
+ } catch (e) {
939
+ this.drainQueueAfterError(e, !0);
940
+ } finally {
941
+ this.effectReadIndex = 0, this.effectWriteIndex = 0, this.flushingEffects = !1;
942
+ }
943
+ }
944
+ }
945
+ /**
946
+ * Завершает очередь после первой ошибки, собирая последующие причины сбоя.
947
+ * Вызывается только на ошибочном пути; успешный проход не создаёт массив ошибок
948
+ * и не устанавливает отдельный catch для каждого элемента.
949
+ */
950
+ drainQueueAfterError(e, t) {
951
+ const i = [e];
952
+ for (; this.effectReadIndex !== this.effectWriteIndex; ) {
953
+ const s = this.effectReadIndex++, n = this.effectQueue[s];
954
+ this.effectQueue[s] = void 0;
955
+ try {
956
+ const a = t ? n.effectTask : void 0;
957
+ a !== void 0 && n.evaluate !== void 0 ? this.scheduleEffectTask(n, a) : (n.flags &= ~x, this.executeEffect(n));
958
+ } catch (a) {
959
+ i.push(a);
960
+ }
961
+ }
962
+ throw i.length === 1 ? e : new AggregateError(i, "Effect queue processing failed.");
963
+ }
964
+ /**
965
+ * Передаёт эффект его постоянной внешней задаче.
966
+ * Если schedule() бросает исключение, снимает незавершённую invalidation,
967
+ * чтобы последующая запись могла снова запросить выполнение.
968
+ */
969
+ requestEffectTask(e) {
970
+ const t = e.effectTask;
971
+ t === void 0 || e.evaluate === void 0 || (e.flags |= x, this.scheduleEffectTask(e, t));
972
+ }
973
+ // Передаёт уже запланированный эффект его постоянной внешней задаче.
974
+ scheduleEffectTask(e, t) {
975
+ try {
976
+ t.schedule();
977
+ } catch (i) {
978
+ throw e.flags &= -72, i;
979
+ }
980
+ }
981
+ /**
982
+ * Окончательно останавливает эффект и освобождает все принадлежащие ему ресурсы.
983
+ * Сначала делает узел неактивным и отсоединяет связи, затем отменяет задачу,
984
+ * останавливает детей, выполняет cleanup и onStop. Каждая стадия завершается
985
+ * несмотря на ошибки соседних стадий; повторный или вложенный stop безопасен.
986
+ */
987
+ disposeEffect(e) {
988
+ if (e.evaluate === void 0)
989
+ return;
990
+ this.activeSub === e && (this.activeSub = null);
991
+ const t = e.effectTask, i = e.onStop, s = typeof e.cachedValue == "function" ? e.cachedValue : void 0;
992
+ e.evaluate = void 0, e.flags = 0, e.cachedValue = void 0, e.effectTask = void 0, i !== void 0 && (e.onStop = void 0), K(e);
993
+ let n = e.firstDep;
994
+ for (; n !== null; ) {
995
+ const l = n.nextDep;
996
+ this.detachSubLink(n), n = l;
997
+ }
998
+ e.firstDep = e.tailDep = null, e.depCount = 0, N(e);
999
+ let a;
1000
+ if (t !== void 0)
1001
+ try {
1002
+ t.dispose();
1003
+ } catch (l) {
1004
+ a = [l];
1005
+ }
1006
+ try {
1007
+ this.disposeNestedEffects(e);
1008
+ } catch (l) {
1009
+ a ?? (a = []), a.push(l);
1010
+ }
1011
+ if (s !== void 0)
1012
+ try {
1013
+ this.untracked(s);
1014
+ } catch (l) {
1015
+ a ?? (a = []), a.push(l);
1016
+ }
1017
+ if (i !== void 0)
1018
+ try {
1019
+ this.untracked(i);
1020
+ } catch (l) {
1021
+ a ?? (a = []), a.push(l);
1022
+ }
1023
+ this.invalidationStack.length = this.invalidationDepth, this.dependencyStack.length = this.dependencyDepth, a !== void 0 && F(a, "Effect disposal failed.");
1024
+ }
1025
+ /**
1026
+ * Останавливает все вложенные эффекты в обратном порядке регистрации.
1027
+ * Всегда берёт актуальный хвост: cleanup может удалить другого ребёнка.
1028
+ * Передаёт собранные ошибки только после освобождения всех детей.
1029
+ */
1030
+ disposeNestedEffects(e) {
1031
+ let t;
1032
+ for (; e.scopeLastChild !== void 0; )
1033
+ try {
1034
+ this.disposeEffect(e.scopeLastChild);
1035
+ } catch (i) {
1036
+ t ?? (t = []), t.push(i);
1037
+ }
1038
+ t !== void 0 && F(t, "Nested effect disposal failed.");
1039
+ }
1040
+ /**
1041
+ * Задаёт обязательные поля графа перед первым вычислением.
1042
+ * Вызывается только для нематериализованного handle; getter и контекст сохраняются.
1043
+ */
1044
+ static materializeComputed(e) {
1045
+ e.flags = T | (e.sourceHooks === void 0 ? 0 : v), e.firstSub = null, e.lastSub = null, e.firstDep = null, e.tailDep = null, e.depCount = 0, e.cachedValue = void 0;
1046
+ }
1047
+ /**
1048
+ * Связывает два разных receiver: движок-владелец и читаемый handle.
1049
+ * Эти четыре общие функции адаптируют this; алгоритмы чтения остаются методами
1050
+ * RaphReactivity. Адаптеры создаются один раз на граф, а не на каждое вычисление.
1051
+ */
1052
+ createHandleReaders() {
1053
+ const e = this;
1054
+ function t() {
1055
+ return e.readComputedValue(this);
1056
+ }
1057
+ return {
1058
+ /**
1059
+ * Материализует computed на месте и заменяет первоначальный get общим reader.
1060
+ */
1061
+ initializeComputed() {
1062
+ const i = this;
1063
+ return U.materializeComputed(i), this.get = t, e.readComputedValue(i);
1064
+ },
1065
+ /**
1066
+ * Материализует raw computed, сохраняя извлечение read после первого вызова.
1067
+ */
1068
+ initializeRaw() {
1069
+ const i = this;
1070
+ U.materializeComputed(i);
1071
+ const s = () => e.readComputedValue(i);
1072
+ return this.read = s, s();
1073
+ },
1074
+ /**
1075
+ * Передаёт handle как аргумент; this самого движка берётся из замыкания.
1076
+ */
1077
+ peek() {
1078
+ return e.peekHandle(this);
1079
+ }
1080
+ };
1081
+ }
1082
+ /**
1083
+ * Читает handle без подписки текущего потребителя, сохраняя receiver get().
1084
+ * Прежний контекст восстанавливается и после исключения getter.
1085
+ */
1086
+ peekHandle(e) {
1087
+ const t = this.activeSub;
1088
+ if (t === null)
1089
+ return e.get();
1090
+ this.activeSub = null;
1091
+ try {
1092
+ return e.get();
1093
+ } finally {
1094
+ this.activeSub = t;
1095
+ }
1096
+ }
1097
+ // ---------------------------------------------
1098
+ // INTERNAL
1099
+ // ---------------------------------------------
1100
+ /**
1101
+ * Создаёт единый низкоуровневый read/write accessor для core-дорожки Bench Lab.
1102
+ * Публичный объектный API остаётся отдельным и измеряется в API-tax.
1103
+ * @internal
1104
+ */
1105
+ _signalAccess(e) {
1106
+ const t = this;
1107
+ let i = e, s;
1108
+ function n(a) {
1109
+ if (arguments.length !== 0) {
1110
+ const h = s;
1111
+ h !== void 0 ? t.writeSignalValue(h, a) : i !== a && (i = a);
1112
+ return;
1113
+ }
1114
+ const l = s;
1115
+ if (l !== void 0)
1116
+ return t.readSignalValue(l);
1117
+ const r = t.activeSub;
1118
+ return r === null || (s = t.materializeSignal(i, r)), i;
1119
+ }
1120
+ return {
1121
+ read: n,
1122
+ write: n
1123
+ };
1124
+ }
1125
+ /**
1126
+ * Создаёт нематериализованный computed для низкоуровневого read API.
1127
+ * Графовые поля появляются при первом чтении; тип описывает обе стадии.
1128
+ * @internal
1129
+ */
1130
+ _computedAccess(e) {
1131
+ return {
1132
+ evaluate: e,
1133
+ read: this.handleReaders.initializeRaw
1134
+ };
1135
+ }
1136
+ /**
1137
+ * Создаёт signal, жизненным циклом которого управляет `ScopeNode`.
1138
+ *
1139
+ * Реактивная логика совпадает с обычным `signal()`, но disposer
1140
+ * дополнительно отсоединяет материализованный источник от графа.
1141
+ *
1142
+ * @internal
1143
+ */
1144
+ _ownedSignal(e, t) {
1145
+ const i = this;
1146
+ let s = e, n, a = !1;
1147
+ const l = () => {
1148
+ const u = n;
1149
+ if (u !== void 0)
1150
+ return this.readSignalValue(u);
1151
+ const o = this.activeSub;
1152
+ if (o === null)
1153
+ return s;
1154
+ const I = s;
1155
+ return n = this.materializeSignal(
1156
+ I,
1157
+ o,
1158
+ t
1159
+ ), s = void 0, I;
1160
+ }, r = t === void 0 ? (u) => {
1161
+ const o = n;
1162
+ o !== void 0 ? this.writeSignalValue(o, u) : s !== u && (s = u);
1163
+ } : (u) => {
1164
+ var I, _;
1165
+ const o = n;
1166
+ if (o !== void 0) {
1167
+ const A = o.flags & d ? o.pendingValue : o.cachedValue;
1168
+ A !== u && ((I = t.onChange) == null || I.call(t, A, u, o.firstSub !== null)), this.writeSignalValue(o, u);
1169
+ return;
1170
+ }
1171
+ s !== u && ((_ = t.onChange) == null || _.call(t, s, u, !1), s = u);
1172
+ }, b = {
1173
+ source: {
1174
+ get: l,
1175
+ peek: this.handleReaders.peek,
1176
+ set: r
1177
+ },
1178
+ /**
1179
+ * Освобождает источник и отсоединяет его от реактивного графа.
1180
+ */
1181
+ dispose() {
1182
+ var o;
1183
+ if (a)
1184
+ return !0;
1185
+ a = !0, s = void 0;
1186
+ let u;
1187
+ try {
1188
+ (o = t == null ? void 0 : t.onDispose) == null || o.call(t, (n == null ? void 0 : n.firstSub) != null);
1189
+ } catch (I) {
1190
+ (u ?? (u = [])).push(I);
1191
+ }
1192
+ if (n !== void 0) {
1193
+ try {
1194
+ i.releaseSourceSubs(n);
1195
+ } catch (I) {
1196
+ (u ?? (u = [])).push(I);
1197
+ }
1198
+ n.cachedValue = void 0, n.pendingValue = void 0, n.pendingAuthor = void 0, n.flags = 0;
1199
+ }
1200
+ if (n = void 0, (u == null ? void 0 : u.length) === 1)
1201
+ throw u[0];
1202
+ if (u !== void 0 && u.length > 1)
1203
+ throw new AggregateError(u, "Owned signal disposal failed.");
1204
+ return !0;
1205
+ }
1206
+ };
1207
+ return t !== void 0 && (b.hasSubscribers = () => (n == null ? void 0 : n.firstSub) != null), b;
1208
+ }
1209
+ /**
1210
+ * Создаёт ленивый computed с финализатором исходящих и входящих связей.
1211
+ * Финализатор работает и до первого вычисления, не материализуя узел ради очистки.
1212
+ * @internal
1213
+ */
1214
+ _ownedComputed(e, t) {
1215
+ const i = this, s = this.createComputedHandle(e, t);
1216
+ let n = !1;
1217
+ const a = {
1218
+ source: s,
1219
+ /**
1220
+ * Отсоединяет принадлежащий источник и освобождает его ссылки.
1221
+ * Повторный вызов возвращает true без повторной очистки.
1222
+ */
1223
+ dispose() {
1224
+ var h;
1225
+ if (n)
1226
+ return !0;
1227
+ n = !0, i.activeSub === s && (i.activeSub = null);
1228
+ const l = [];
1229
+ try {
1230
+ (h = t == null ? void 0 : t.onDispose) == null || h.call(t, s.firstSub != null);
1231
+ } catch (b) {
1232
+ l.push(b);
1233
+ }
1234
+ if (s.flags !== void 0)
1235
+ try {
1236
+ i.releaseSourceSubs(s);
1237
+ } catch (b) {
1238
+ l.push(b);
1239
+ }
1240
+ let r = s.firstDep;
1241
+ for (; r != null; ) {
1242
+ const b = r.nextDep;
1243
+ i.detachSubLink(r), r = b;
1244
+ }
1245
+ if (s.firstDep = s.tailDep = null, s.depCount = 0, N(s), s.evaluate = void 0, s.cachedValue = void 0, s.flags = 0, l.length === 1)
1246
+ throw l[0];
1247
+ if (l.length > 1)
1248
+ throw new AggregateError(l, "Owned computed disposal failed.");
1249
+ return !0;
1250
+ }
1251
+ };
1252
+ return t !== void 0 && (a.hasSubscribers = () => s.firstSub != null), a;
1253
+ }
1254
+ /**
1255
+ * Открывает вложенную синхронную границу группировки.
1256
+ * Внутренний вызывающий код обязан выполнить соответствующий endBatch().
1257
+ * @internal
1258
+ */
1259
+ _startBatch() {
1260
+ ++this.batchDepth;
1261
+ }
1262
+ /**
1263
+ * Закрывает ранее открытую границу и обрабатывает очередь на внешнем уровне.
1264
+ * Предусловие: число закрытий не должно превышать число открытий.
1265
+ * @internal
1266
+ */
1267
+ _endBatch() {
1268
+ !--this.batchDepth && this.effectReadIndex !== this.effectWriteIndex && this.flushEffects();
1269
+ }
1270
+ /**
1271
+ * Проверяет наличие активного потребителя в текущем синхронном стеке чтения.
1272
+ * @internal
1273
+ */
1274
+ _isTracking() {
1275
+ return this.activeSub !== null;
1276
+ }
1277
+ /**
1278
+ * Показывает, обрабатывает ли экземпляр внутреннюю очередь эффектов.
1279
+ * @internal
1280
+ */
1281
+ _isFlushingEffects() {
1282
+ return this.flushingEffects;
1283
+ }
1284
+ }
1285
+ let Z;
1286
+ function V() {
1287
+ return Z ?? (Z = new U());
1288
+ }
1289
+ const te = (c) => V().signal(c), ie = (c) => V().reactive(c);
1290
+ function se(c) {
1291
+ return V().computed(c);
1292
+ }
1293
+ const ne = (c, e) => V().effect(c, e), ae = (c, e, t) => V().watch(c, e, t), le = (c) => V().batch(c), re = (c) => V().untracked(c), ce = () => V().scope();
1294
+ export {
1295
+ U as RaphReactivity,
1296
+ M as ScopeNode,
1297
+ le as batch,
1298
+ se as computed,
1299
+ ne as effect,
1300
+ ie as reactive,
1301
+ ce as scope,
1302
+ te as signal,
1303
+ re as untracked,
1304
+ ae as watch
1305
+ };