@actuallab/fusion 12.1.62

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.
package/dist/index.js ADDED
@@ -0,0 +1,661 @@
1
+ // src/computed-input.ts
2
+ var _nextInstanceId = 0;
3
+ var _instanceIds = /* @__PURE__ */ new WeakMap();
4
+ function getInstanceId(instance) {
5
+ let id = _instanceIds.get(instance);
6
+ if (id === void 0) {
7
+ id = ++_nextInstanceId;
8
+ _instanceIds.set(instance, id);
9
+ }
10
+ return id;
11
+ }
12
+
13
+ // src/computed.ts
14
+ import { AsyncContext as AsyncContext2, EventHandlerSet, PromiseSource, Result, result } from "@actuallab/core";
15
+
16
+ // src/computed-registry.ts
17
+ var ComputedRegistry = class _ComputedRegistry {
18
+ static _entries = /* @__PURE__ */ new Map();
19
+ static _finalization = new FinalizationRegistry((key) => {
20
+ _ComputedRegistry._entries.delete(key);
21
+ });
22
+ static get size() {
23
+ return _ComputedRegistry._entries.size;
24
+ }
25
+ static get(key) {
26
+ const ref = _ComputedRegistry._entries.get(key);
27
+ if (ref === void 0) return void 0;
28
+ const computed = ref.deref();
29
+ if (computed === void 0) {
30
+ _ComputedRegistry._entries.delete(key);
31
+ return void 0;
32
+ }
33
+ return computed;
34
+ }
35
+ static register(computed) {
36
+ const key = computed.input;
37
+ _ComputedRegistry._entries.set(key, new WeakRef(computed));
38
+ _ComputedRegistry._finalization.register(computed, key, computed);
39
+ }
40
+ static unregister(computed) {
41
+ const key = computed.input;
42
+ _ComputedRegistry._entries.delete(key);
43
+ _ComputedRegistry._finalization.unregister(computed);
44
+ }
45
+ };
46
+
47
+ // src/compute-context.ts
48
+ import { AsyncContext, AsyncContextKey } from "@actuallab/core";
49
+ var computeContextKey = new AsyncContextKey("ComputeContext", void 0);
50
+ var ComputeContext = class {
51
+ computed;
52
+ _isCapturing = true;
53
+ constructor(computed) {
54
+ this.computed = computed;
55
+ }
56
+ get isCapturing() {
57
+ return this._isCapturing;
58
+ }
59
+ stopCapturing() {
60
+ this._isCapturing = false;
61
+ }
62
+ captureDependency(dependency) {
63
+ if (!this._isCapturing) return;
64
+ this.computed.addDependency(dependency);
65
+ }
66
+ /** Resolve ComputeContext from an AsyncContext (or current). */
67
+ static from(ctx) {
68
+ return AsyncContext.from(ctx)?.get(computeContextKey);
69
+ }
70
+ };
71
+
72
+ // src/computed.ts
73
+ var _nextVersion = 0;
74
+ var ConsistencyState = /* @__PURE__ */ ((ConsistencyState2) => {
75
+ ConsistencyState2[ConsistencyState2["Computing"] = 0] = "Computing";
76
+ ConsistencyState2[ConsistencyState2["Consistent"] = 1] = "Consistent";
77
+ ConsistencyState2[ConsistencyState2["Invalidated"] = 2] = "Invalidated";
78
+ return ConsistencyState2;
79
+ })(ConsistencyState || {});
80
+ var Computed = class _Computed {
81
+ /** Delay before auto-invalidating a Computed that holds an error result. 0 = disabled. */
82
+ static errorAutoInvalidateDelay = 1e3;
83
+ /** Capture the Computed backing a computation — works with both local and RPC compute methods. */
84
+ static async capture(fn) {
85
+ const captureComputed = new _Computed("__capture__");
86
+ const captureCtx = new ComputeContext(captureComputed);
87
+ const asyncCtx = AsyncContext2.getOrCreate().with(computeContextKey, captureCtx);
88
+ await asyncCtx.run(fn);
89
+ const deps = captureComputed.dependencies;
90
+ if (deps.size === 0)
91
+ throw new Error("No Computed was captured \u2014 fn must call a compute function.");
92
+ return deps.values().next().value;
93
+ }
94
+ input;
95
+ _version;
96
+ _state;
97
+ _output;
98
+ _dependencies = /* @__PURE__ */ new Set();
99
+ _dependants = /* @__PURE__ */ new Map();
100
+ onInvalidated = new EventHandlerSet();
101
+ _renewer;
102
+ constructor(input, renewer) {
103
+ this.input = input;
104
+ this._renewer = renewer;
105
+ this._version = ++_nextVersion;
106
+ this._state = 0 /* Computing */;
107
+ }
108
+ get version() {
109
+ return this._version;
110
+ }
111
+ get output() {
112
+ if (this._output === void 0) throw new Error("Computed has no output yet.");
113
+ return this._output;
114
+ }
115
+ get hasValue() {
116
+ return this.output.hasValue;
117
+ }
118
+ get hasError() {
119
+ return this.output.hasError;
120
+ }
121
+ get value() {
122
+ return this.output.value;
123
+ }
124
+ get error() {
125
+ return this.output.error;
126
+ }
127
+ get valueOrUndefined() {
128
+ return this.output.valueOrUndefined;
129
+ }
130
+ get state() {
131
+ return this._state;
132
+ }
133
+ get isConsistent() {
134
+ return this._state === 1 /* Consistent */;
135
+ }
136
+ get dependencies() {
137
+ return this._dependencies;
138
+ }
139
+ update() {
140
+ if (this._state === 1 /* Consistent */) return this;
141
+ const latest = this._latest();
142
+ if (latest?.isConsistent) return latest;
143
+ if (this._renewer !== void 0) return this._renewer();
144
+ throw new Error("Cannot recompute: Computed is invalidated and has no renewer.");
145
+ }
146
+ _latest() {
147
+ return ComputedRegistry.get(this.input);
148
+ }
149
+ use(asyncContext) {
150
+ const ctx = ComputeContext.from(asyncContext);
151
+ const updated = this.update();
152
+ if (updated instanceof Promise) {
153
+ return updated.then((c) => {
154
+ ctx?.captureDependency(c);
155
+ return c.value;
156
+ });
157
+ }
158
+ ctx?.captureDependency(updated);
159
+ return updated.value;
160
+ }
161
+ useInconsistent(asyncContext) {
162
+ ComputeContext.from(asyncContext)?.captureDependency(this);
163
+ return this.value;
164
+ }
165
+ setOutput(output) {
166
+ if (this._state !== 0 /* Computing */)
167
+ throw new Error("Cannot set output on a non-computing Computed.");
168
+ this._output = output instanceof Result ? output : result(output);
169
+ this._state = 1 /* Consistent */;
170
+ this._register();
171
+ if (this._output.hasError && _Computed.errorAutoInvalidateDelay > 0)
172
+ setTimeout(() => this.invalidate(), _Computed.errorAutoInvalidateDelay);
173
+ }
174
+ _register() {
175
+ ComputedRegistry.register(this);
176
+ }
177
+ _unregister() {
178
+ ComputedRegistry.unregister(this);
179
+ }
180
+ invalidate() {
181
+ if (this._state === 2 /* Invalidated */) return;
182
+ this._state = 2 /* Invalidated */;
183
+ this._dependencies.clear();
184
+ for (const [, ref] of this._dependants) {
185
+ const dependant = ref.deref();
186
+ if (dependant != null) dependant.invalidate();
187
+ }
188
+ this._dependants.clear();
189
+ this.onInvalidated.trigger();
190
+ this.onInvalidated.clear();
191
+ this._unregister();
192
+ }
193
+ whenInvalidated(abortSignal) {
194
+ if (this._state === 2 /* Invalidated */)
195
+ return Promise.resolve();
196
+ const ps = new PromiseSource();
197
+ const handler = () => ps.resolve(void 0);
198
+ this.onInvalidated.add(handler);
199
+ if (abortSignal !== void 0 && !abortSignal.aborted) {
200
+ abortSignal.addEventListener("abort", () => {
201
+ this.onInvalidated.remove(handler);
202
+ ps.reject(abortSignal.reason);
203
+ }, { once: true });
204
+ }
205
+ return ps.promise;
206
+ }
207
+ addDependency(dependency) {
208
+ this._dependencies.add(dependency);
209
+ dependency._dependants.set(this._version, new WeakRef(this));
210
+ }
211
+ };
212
+ var StateBoundComputed = class extends Computed {
213
+ constructor(state, renewer) {
214
+ super(state, renewer);
215
+ }
216
+ _latest() {
217
+ return this.input.computed;
218
+ }
219
+ _register() {
220
+ }
221
+ _unregister() {
222
+ }
223
+ };
224
+
225
+ // src/compute-function.ts
226
+ import { AsyncContext as AsyncContext3, AsyncLock, result as result2, errorResult } from "@actuallab/core";
227
+ var RS = "";
228
+ function defaultArgToString(arg) {
229
+ return JSON.stringify(arg) ?? "undefined";
230
+ }
231
+ var _nextFunctionId = 0;
232
+ var ComputeFunction = class {
233
+ methodName;
234
+ id;
235
+ argToString = defaultArgToString;
236
+ _impl;
237
+ _locks = /* @__PURE__ */ new Map();
238
+ constructor(methodName, impl) {
239
+ this.methodName = methodName;
240
+ this.id = `${methodName}[${++_nextFunctionId}]`;
241
+ this._impl = impl;
242
+ }
243
+ /** Build a string key for the given instance and arguments. */
244
+ buildKey(instance, args) {
245
+ let key = String(getInstanceId(instance)) + RS + this.id;
246
+ for (const arg of args) {
247
+ key += RS + this.argToString(arg);
248
+ }
249
+ return key;
250
+ }
251
+ async invoke(instance, args, prevComputed) {
252
+ const asyncCtx = AsyncContext3.fromArgs(args);
253
+ const callerComputeCtx = asyncCtx?.get(computeContextKey);
254
+ const argsWithoutCtx = asyncCtx?.stripFromArgs(args) ?? args;
255
+ const key = this.buildKey(instance, argsWithoutCtx);
256
+ const existing = ComputedRegistry.get(key);
257
+ if (existing?.isConsistent) {
258
+ callerComputeCtx?.captureDependency(existing);
259
+ return existing;
260
+ }
261
+ let lock = this._locks.get(key);
262
+ if (lock === void 0) {
263
+ lock = new AsyncLock();
264
+ this._locks.set(key, lock);
265
+ }
266
+ const computed = await lock.run(async () => {
267
+ const cached = ComputedRegistry.get(key);
268
+ if (cached?.isConsistent) return cached;
269
+ let newComputed;
270
+ const renewer = prevComputed?._renewer ?? (() => this.invoke(instance, argsWithoutCtx, newComputed));
271
+ newComputed = new Computed(key, renewer);
272
+ const childComputeCtx = new ComputeContext(newComputed);
273
+ const childAsyncCtx = (asyncCtx ?? AsyncContext3.empty).with(computeContextKey, childComputeCtx);
274
+ let fnResult;
275
+ try {
276
+ const value = childAsyncCtx.run(() => this._impl.call(instance, ...argsWithoutCtx));
277
+ const resolved = value instanceof Promise ? await value : value;
278
+ fnResult = result2(resolved);
279
+ } catch (e) {
280
+ fnResult = errorResult(e);
281
+ }
282
+ newComputed.setOutput(fnResult);
283
+ return newComputed;
284
+ });
285
+ callerComputeCtx?.captureDependency(computed);
286
+ return computed;
287
+ }
288
+ };
289
+
290
+ // src/compute-method.ts
291
+ var METHODS_META = /* @__PURE__ */ Symbol.for("actuallab.methods");
292
+ function getMethodsMeta(cls) {
293
+ return cls[Symbol.metadata]?.[METHODS_META];
294
+ }
295
+ function computeMethod(target, context) {
296
+ const methodName = String(context.name);
297
+ const methods = context.metadata[METHODS_META] ??= {};
298
+ methods[methodName] = { ...methods[methodName], compute: true, argCount: target.length };
299
+ const cf = new ComputeFunction(methodName, target);
300
+ const replacement = function(...allArgs) {
301
+ return cf.invoke(this, allArgs).then((c) => c.value);
302
+ };
303
+ context.addInitializer(function() {
304
+ const instance = this;
305
+ const boundMethod = (...allArgs) => {
306
+ return cf.invoke(instance, allArgs).then((c) => c.value);
307
+ };
308
+ boundMethod.invalidate = (...args) => {
309
+ const key = cf.buildKey(instance, args);
310
+ ComputedRegistry.get(key)?.invalidate();
311
+ };
312
+ this[methodName] = boundMethod;
313
+ });
314
+ return replacement;
315
+ }
316
+ function wrapComputeMethod(fn) {
317
+ const syntheticInstance = {};
318
+ const methodName = fn.name || "anonymous";
319
+ const cf = new ComputeFunction(methodName, fn);
320
+ const wrapped = (...allArgs) => {
321
+ return cf.invoke(syntheticInstance, allArgs).then((c) => c.value);
322
+ };
323
+ wrapped.invalidate = (...args) => {
324
+ const key = cf.buildKey(syntheticInstance, args);
325
+ ComputedRegistry.get(key)?.invalidate();
326
+ };
327
+ return wrapped;
328
+ }
329
+
330
+ // src/update-delayer.ts
331
+ var FixedDelayer = class _FixedDelayer {
332
+ static zero = () => Promise.resolve();
333
+ static _cache = /* @__PURE__ */ new Map();
334
+ static get(ms) {
335
+ if (ms <= 0) return _FixedDelayer.zero;
336
+ let delayer = _FixedDelayer._cache.get(ms);
337
+ if (delayer === void 0) {
338
+ delayer = new _FixedDelayer(ms).delay;
339
+ _FixedDelayer._cache.set(ms, delayer);
340
+ }
341
+ return delayer;
342
+ }
343
+ ms;
344
+ delay;
345
+ constructor(ms) {
346
+ this.ms = ms;
347
+ this.delay = ms > 1e4 ? (abortSignal) => new Promise((resolve, reject) => {
348
+ const timer = setTimeout(resolve, this.ms);
349
+ if (abortSignal === void 0) return;
350
+ if (abortSignal.aborted) {
351
+ clearTimeout(timer);
352
+ reject(abortSignal.reason);
353
+ return;
354
+ }
355
+ abortSignal.addEventListener("abort", () => {
356
+ clearTimeout(timer);
357
+ reject(abortSignal.reason);
358
+ }, { once: true });
359
+ }) : () => new Promise((resolve) => setTimeout(resolve, this.ms));
360
+ }
361
+ };
362
+ var defaultUpdateDelayer = FixedDelayer.get(1e3 / 60);
363
+
364
+ // src/ui-action-tracker.ts
365
+ import { EventHandlerSet as EventHandlerSet2 } from "@actuallab/core";
366
+ var UIActionTracker = class {
367
+ _activeCount = 0;
368
+ changed = new EventHandlerSet2();
369
+ errors = [];
370
+ get isActive() {
371
+ return this._activeCount > 0;
372
+ }
373
+ /** Run a command silently — errors are added to the error list but not thrown. */
374
+ async run(fn) {
375
+ this._activeCount++;
376
+ this.changed.trigger();
377
+ try {
378
+ await fn();
379
+ } catch (e) {
380
+ this.errors.push(e);
381
+ } finally {
382
+ this._activeCount--;
383
+ await new Promise((r) => setTimeout(r, 50));
384
+ this.changed.trigger();
385
+ }
386
+ }
387
+ /** Call a command and return the result — errors are added to the error list AND thrown. */
388
+ async call(fn) {
389
+ this._activeCount++;
390
+ this.changed.trigger();
391
+ try {
392
+ return await fn();
393
+ } catch (e) {
394
+ this.errors.push(e);
395
+ throw e;
396
+ } finally {
397
+ this._activeCount--;
398
+ await new Promise((r) => setTimeout(r, 50));
399
+ this.changed.trigger();
400
+ }
401
+ }
402
+ dismissError(index) {
403
+ if (index >= 0 && index < this.errors.length) {
404
+ this.errors.splice(index, 1);
405
+ this.changed.trigger();
406
+ }
407
+ }
408
+ };
409
+ var uiActions = new UIActionTracker();
410
+
411
+ // src/ui-update-delayer.ts
412
+ var UIUpdateDelayer = class _UIUpdateDelayer {
413
+ static _cache = /* @__PURE__ */ new Map();
414
+ static get(ms) {
415
+ if (ms <= 0) return FixedDelayer.zero;
416
+ let delayer = _UIUpdateDelayer._cache.get(ms);
417
+ if (delayer !== void 0) return delayer;
418
+ const t = uiActions;
419
+ delayer = (abortSignal) => {
420
+ if (t.isActive)
421
+ return Promise.resolve();
422
+ return new Promise((resolve, reject) => {
423
+ const timer = setTimeout(resolve, ms);
424
+ const onChanged = () => {
425
+ if (t.isActive) {
426
+ clearTimeout(timer);
427
+ t.changed.remove(onChanged);
428
+ resolve();
429
+ }
430
+ };
431
+ t.changed.add(onChanged);
432
+ if (abortSignal !== void 0) {
433
+ if (abortSignal.aborted) {
434
+ clearTimeout(timer);
435
+ t.changed.remove(onChanged);
436
+ reject(abortSignal.reason);
437
+ return;
438
+ }
439
+ abortSignal.addEventListener("abort", () => {
440
+ clearTimeout(timer);
441
+ t.changed.remove(onChanged);
442
+ reject(abortSignal.reason);
443
+ }, { once: true });
444
+ }
445
+ });
446
+ };
447
+ _UIUpdateDelayer._cache.set(ms, delayer);
448
+ return delayer;
449
+ }
450
+ };
451
+
452
+ // src/state.ts
453
+ import { PromiseSource as PromiseSource2, resolvedVoidPromise } from "@actuallab/core";
454
+ var State = class {
455
+ _computed;
456
+ _updateIndex = 0;
457
+ _lastNonErrorValue;
458
+ _whenUpdatedSource = null;
459
+ get updateIndex() {
460
+ return this._updateIndex;
461
+ }
462
+ get lastNonErrorValue() {
463
+ return this._lastNonErrorValue;
464
+ }
465
+ get hasValue() {
466
+ return this._computed.hasValue;
467
+ }
468
+ get hasError() {
469
+ return this._computed.hasError;
470
+ }
471
+ get value() {
472
+ return this._computed.value;
473
+ }
474
+ get error() {
475
+ return this._computed.error;
476
+ }
477
+ get valueOrUndefined() {
478
+ return this._computed.valueOrUndefined;
479
+ }
480
+ get output() {
481
+ return this._computed.output;
482
+ }
483
+ get computed() {
484
+ return this._computed;
485
+ }
486
+ use(asyncContext) {
487
+ return this._computed.use(asyncContext);
488
+ }
489
+ useInconsistent(asyncContext) {
490
+ return this._computed.useInconsistent(asyncContext);
491
+ }
492
+ update() {
493
+ return this._computed.update();
494
+ }
495
+ recompute() {
496
+ this._computed.invalidate();
497
+ return this.update();
498
+ }
499
+ whenInvalidated() {
500
+ return this._computed.whenInvalidated();
501
+ }
502
+ whenUpdated() {
503
+ return (this._whenUpdatedSource ??= new PromiseSource2()).promise;
504
+ }
505
+ whenFirstTimeUpdated() {
506
+ return this._updateIndex > 0 ? resolvedVoidPromise : this.whenUpdated();
507
+ }
508
+ _initialize(output, renewer) {
509
+ this._computed = new StateBoundComputed(this, renewer);
510
+ this._computed.setOutput(output);
511
+ this._lastNonErrorValue = this._computed.valueOrUndefined;
512
+ }
513
+ _update(computed, output) {
514
+ computed.setOutput(output);
515
+ this._computed = computed;
516
+ if (computed.hasValue)
517
+ this._lastNonErrorValue = computed.value;
518
+ this._updateIndex++;
519
+ this._whenUpdatedSource?.resolve(void 0);
520
+ this._whenUpdatedSource = null;
521
+ }
522
+ };
523
+
524
+ // src/computed-state.ts
525
+ import { AsyncContext as AsyncContext4, PromiseSource as PromiseSource3, result as result3, errorResult as errorResult2 } from "@actuallab/core";
526
+ var ComputedState = class extends State {
527
+ _computer;
528
+ _updateDelayer;
529
+ _disposeController;
530
+ _cancelDelaySource = new PromiseSource3();
531
+ _renewer;
532
+ _hasOutput = false;
533
+ constructor(computer, options) {
534
+ super();
535
+ this._computer = computer;
536
+ this._updateDelayer = options?.updateDelayer ?? defaultUpdateDelayer;
537
+ this._disposeController = new AbortController();
538
+ this._renewer = async () => {
539
+ const whenUpdated = this.whenUpdated();
540
+ this._cancelDelaySource.resolve(void 0);
541
+ await whenUpdated;
542
+ return this._computed;
543
+ };
544
+ if (options?.initialOutput !== void 0 || options?.initialValue !== void 0) {
545
+ this._initialize(options.initialOutput ?? options.initialValue, this._renewer);
546
+ this._hasOutput = true;
547
+ }
548
+ void this._updateCycle();
549
+ }
550
+ get hasValue() {
551
+ if (!this._hasOutput && this._updateIndex === 0) return false;
552
+ return this._computed.hasValue;
553
+ }
554
+ get hasError() {
555
+ if (!this._hasOutput && this._updateIndex === 0) return false;
556
+ return this._computed.hasError;
557
+ }
558
+ get value() {
559
+ if (!this._hasOutput && this._updateIndex === 0) throw new Error("ComputedState has no value yet.");
560
+ if (this._computed.hasValue) return this._computed.value;
561
+ if (this._lastNonErrorValue !== void 0) return this._lastNonErrorValue;
562
+ throw new Error("ComputedState has no value yet.");
563
+ }
564
+ get error() {
565
+ if (!this._hasOutput && this._updateIndex === 0) return void 0;
566
+ return this._computed.error;
567
+ }
568
+ get valueOrUndefined() {
569
+ if (!this._hasOutput && this._updateIndex === 0) return void 0;
570
+ return this._computed.valueOrUndefined ?? this._lastNonErrorValue;
571
+ }
572
+ get output() {
573
+ if (!this._hasOutput && this._updateIndex === 0) throw new Error("ComputedState has no output yet.");
574
+ return this._computed.output;
575
+ }
576
+ get computed() {
577
+ if (!this._hasOutput && this._updateIndex === 0) throw new Error("ComputedState has not been computed yet.");
578
+ return this._computed;
579
+ }
580
+ get isDisposed() {
581
+ return this._disposeController.signal.aborted;
582
+ }
583
+ dispose() {
584
+ if (!this.isDisposed)
585
+ this._disposeController.abort();
586
+ }
587
+ async _updateCycle() {
588
+ const disposeSignal = this._disposeController.signal;
589
+ try {
590
+ while (!disposeSignal.aborted) {
591
+ const computed = new StateBoundComputed(this, this._renewer);
592
+ const computeCtx = new ComputeContext(computed);
593
+ const asyncCtx = (AsyncContext4.current ?? AsyncContext4.empty).with(computeContextKey, computeCtx);
594
+ let output;
595
+ try {
596
+ const value = asyncCtx.run(() => this._computer());
597
+ const resolved = value instanceof Promise ? await value : value;
598
+ output = result3(resolved);
599
+ } catch (e) {
600
+ output = errorResult2(e);
601
+ }
602
+ this._update(computed, output);
603
+ if (this._cancelDelaySource.isCompleted)
604
+ this._cancelDelaySource = new PromiseSource3();
605
+ try {
606
+ await computed.whenInvalidated(disposeSignal);
607
+ } catch {
608
+ return;
609
+ }
610
+ await Promise.race([
611
+ this._updateDelayer(disposeSignal),
612
+ this._cancelDelaySource.promise
613
+ ]);
614
+ }
615
+ } catch (e) {
616
+ }
617
+ }
618
+ };
619
+
620
+ // src/mutable-state.ts
621
+ import "@actuallab/core";
622
+ var MutableState = class extends State {
623
+ _renewer = () => {
624
+ const computed = new StateBoundComputed(this, this._renewer);
625
+ this._update(computed, this._computed.output);
626
+ return computed;
627
+ };
628
+ constructor(initialOutput) {
629
+ super();
630
+ this._initialize(initialOutput, this._renewer);
631
+ }
632
+ use(asyncContext) {
633
+ return this._computed.use(asyncContext);
634
+ }
635
+ set(output) {
636
+ this._computed.invalidate();
637
+ this._update(new StateBoundComputed(this, this._renewer), output);
638
+ }
639
+ };
640
+ export {
641
+ ComputeContext,
642
+ ComputeFunction,
643
+ Computed,
644
+ ComputedRegistry,
645
+ ComputedState,
646
+ ConsistencyState,
647
+ FixedDelayer,
648
+ MutableState,
649
+ State,
650
+ StateBoundComputed,
651
+ UIActionTracker,
652
+ UIUpdateDelayer,
653
+ computeContextKey,
654
+ computeMethod,
655
+ defaultUpdateDelayer,
656
+ getInstanceId,
657
+ getMethodsMeta,
658
+ uiActions,
659
+ wrapComputeMethod
660
+ };
661
+ //# sourceMappingURL=index.js.map