mutts 1.0.10 → 1.0.11

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 (55) hide show
  1. package/README.md +3 -3
  2. package/dist/browser.cjs +395 -987
  3. package/dist/browser.cjs.map +1 -1
  4. package/dist/browser.d.ts +2 -2
  5. package/dist/browser.dev.cjs +13 -9
  6. package/dist/browser.dev.cjs.map +1 -1
  7. package/dist/browser.dev.d.ts +2 -2
  8. package/dist/browser.dev.esm.js +2 -2
  9. package/dist/browser.esm.js +15 -13
  10. package/dist/browser.esm.js.map +1 -1
  11. package/dist/chunks/{async-browser-BU_IfxYD.cjs → async-browser-Dgr5CreQ.cjs} +13 -11
  12. package/dist/chunks/async-browser-Dgr5CreQ.cjs.map +1 -0
  13. package/dist/chunks/{index-CaaQQlPJ.esm.js → index-Sf74wXTV.esm.js} +384 -981
  14. package/dist/chunks/index-Sf74wXTV.esm.js.map +1 -0
  15. package/dist/chunks/{node-nKJBk8iJ.esm.js → node-Bo7WU5S2.esm.js} +2 -2
  16. package/dist/chunks/{node-nKJBk8iJ.esm.js.map → node-Bo7WU5S2.esm.js.map} +1 -1
  17. package/dist/chunks/{proxy-Dtg-bJ3T.cjs → proxy-Cc79Lrzj.cjs} +414 -339
  18. package/dist/chunks/proxy-Cc79Lrzj.cjs.map +1 -0
  19. package/dist/chunks/{proxy-r7lARftl.esm.js → proxy-D2C49sXH.esm.js} +401 -330
  20. package/dist/chunks/proxy-D2C49sXH.esm.js.map +1 -0
  21. package/dist/debug.cjs +17 -3
  22. package/dist/debug.cjs.map +1 -1
  23. package/dist/debug.d.ts +2 -2
  24. package/dist/debug.esm.js +17 -3
  25. package/dist/debug.esm.js.map +1 -1
  26. package/dist/index.d.ts +84 -209
  27. package/dist/mutts.umd.js +842 -1362
  28. package/dist/mutts.umd.js.map +1 -1
  29. package/dist/mutts.umd.min.js +1 -1
  30. package/dist/mutts.umd.min.js.map +1 -1
  31. package/dist/node.cjs +13 -9
  32. package/dist/node.cjs.map +1 -1
  33. package/dist/node.d.ts +2 -2
  34. package/dist/node.dev.cjs +13 -9
  35. package/dist/node.dev.cjs.map +1 -1
  36. package/dist/node.dev.d.ts +2 -2
  37. package/dist/node.dev.esm.js +3 -3
  38. package/dist/node.esm.js +3 -3
  39. package/dist/{types-W5vD6m2n.d.ts → types-Bx2PhORg.d.ts} +38 -47
  40. package/docs/ai/api-reference.md +0 -14
  41. package/docs/ai/manual.md +2 -22
  42. package/docs/reactive/advanced.md +13 -14
  43. package/docs/reactive/attend.md +1 -2
  44. package/docs/reactive/collections.md +2 -149
  45. package/docs/reactive/core.md +218 -96
  46. package/docs/reactive/debugging.md +2 -2
  47. package/docs/reactive/resource.md +1 -1
  48. package/docs/reactive.md +1 -3
  49. package/docs/zone.md +1 -1
  50. package/package.json +18 -9
  51. package/dist/chunks/async-browser-BU_IfxYD.cjs.map +0 -1
  52. package/dist/chunks/index-CaaQQlPJ.esm.js.map +0 -1
  53. package/dist/chunks/proxy-Dtg-bJ3T.cjs.map +0 -1
  54. package/dist/chunks/proxy-r7lARftl.esm.js.map +0 -1
  55. package/docs/reactive/scan.md +0 -324
package/dist/node.cjs CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  require('./chunks/async-node-3PrbVAbB.cjs');
4
4
  var browser = require('./browser.cjs');
5
- var proxy = require('./chunks/proxy-Dtg-bJ3T.cjs');
5
+ var proxy = require('./chunks/proxy-Cc79Lrzj.cjs');
6
6
  var asyncCore = require('./chunks/async-core-CRLKP3l-.cjs');
7
7
  require('node:async_hooks');
8
- require('./chunks/async-browser-BU_IfxYD.cjs');
8
+ require('./chunks/async-browser-Dgr5CreQ.cjs');
9
9
 
10
10
 
11
11
 
@@ -14,7 +14,6 @@ exports.Destroyable = browser.Destroyable;
14
14
  exports.DestructionError = browser.DestructionError;
15
15
  exports.Eventful = browser.Eventful;
16
16
  exports.Indexable = browser.Indexable;
17
- exports.Register = browser.Register;
18
17
  exports.allocated = browser.allocated;
19
18
  exports.allocatedValues = browser.allocatedValues;
20
19
  exports.arrayDiff = browser.arrayDiff;
@@ -38,9 +37,7 @@ exports.organize = browser.organize;
38
37
  exports.organized = browser.organized;
39
38
  exports.profileInfo = browser.profileInfo;
40
39
  exports.project = browser.morph;
41
- exports.register = browser.register;
42
40
  exports.resource = browser.resource;
43
- exports.scan = browser.scan;
44
41
  exports.setAt = browser.setAt;
45
42
  exports.throttle = browser.throttle;
46
43
  exports.unreactive = browser.unreactive;
@@ -60,18 +57,21 @@ exports.Zone = proxy.Zone;
60
57
  exports.ZoneAggregator = proxy.ZoneAggregator;
61
58
  exports.ZoneHistory = proxy.ZoneHistory;
62
59
  exports.addBatchCleanup = proxy.addBatchCleanup;
60
+ exports.addUnreactiveProps = proxy.addUnreactiveProps;
63
61
  exports.arrayEquals = proxy.arrayEquals;
62
+ exports.assertUntracked = proxy.assertUntracked;
64
63
  exports.asyncZone = proxy.asyncZone;
65
64
  exports.atom = proxy.atom;
66
65
  exports.atomic = proxy.atomic;
67
66
  exports.biDi = proxy.biDi;
67
+ exports.captured = proxy.captured;
68
68
  exports.caught = proxy.caught;
69
- exports.cleanedBy = proxy.cleanedBy;
70
- exports.cleanup = proxy.cleanup;
71
69
  exports.createFlavor = proxy.createFlavor;
70
+ exports.debugPreset = proxy.debugPreset;
72
71
  exports.decorator = proxy.decorator;
73
72
  exports.deepCompare = proxy.deepCompare;
74
73
  exports.defer = proxy.defer;
74
+ exports.devPreset = proxy.devPreset;
75
75
  exports.effect = proxy.effect;
76
76
  exports.effectAggregator = proxy.effectAggregator;
77
77
  exports.flavorOptions = proxy.flavorOptions;
@@ -80,26 +80,30 @@ exports.formatCleanupReason = proxy.formatCleanupReason;
80
80
  exports.getActivationLog = proxy.getActivationLog;
81
81
  exports.getActiveEffect = proxy.getActiveEffect;
82
82
  exports.getState = proxy.getState;
83
- exports.immutables = proxy.immutables;
84
83
  exports.isConstructor = proxy.isConstructor;
84
+ exports.isDev = proxy.isDev;
85
85
  exports.isNonReactive = proxy.isNonReactive;
86
86
  exports.isObject = proxy.isObject;
87
+ exports.isProd = proxy.isProd;
87
88
  exports.isReactive = proxy.isReactive;
89
+ exports.isTest = proxy.isTest;
88
90
  exports.legacyDecorator = proxy.legacyDecorator;
91
+ exports.link = proxy.link;
89
92
  exports.mixin = proxy.mixin;
90
93
  exports.modernDecorator = proxy.modernDecorator;
91
94
  exports.named = proxy.named;
92
95
  exports.objectToProxy = proxy.objectToProxy;
93
96
  exports.onEffectThrow = proxy.onEffectThrow;
97
+ exports.prodPreset = proxy.prodPreset;
94
98
  exports.proxyToObject = proxy.proxyToObject;
95
99
  exports.reactive = proxy.reactive;
96
100
  exports.reactiveOptions = proxy.options;
97
101
  exports.reset = proxy.reset;
98
102
  exports.root = proxy.root;
99
- exports.stopped = proxy.stopped;
100
103
  exports.tag = proxy.tag;
101
104
  exports.touched = proxy.touched;
102
105
  exports.touched1 = proxy.touched1;
106
+ exports.unlink = proxy.unlink;
103
107
  exports.untracked = proxy.untracked;
104
108
  exports.unwrap = proxy.unwrap;
105
109
  exports.zip = proxy.zip;
package/dist/node.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"node.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/node.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { ArrayDiffResult, ArrayReadForward, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, PromiseChain, ReactiveBase, Register, Resource, Restorer, ScanResult, addBatchCleanup, allocated, allocatedValues, arrayDiff, arrayEquals, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, caught, chainPromise, cleanedBy, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, immutables, isCached, isConstructor, isNonReactive, isObject, legacyDecorator, lift, memoize, mixin, modernDecorator, morph, named, onEffectThrow, organize, organized, profileInfo, morph as project, reactive, register, reset, resource, root, scan, setAt, tag, throttle, touched, touched1, unreactive, untracked, watch, when, zip } from './index.js';
2
- export { A as AZone, h as CleanupReason, e as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, F as FunctionWrapper, P as PropTrigger, R as ReactiveError, i as ReactiveErrorCode, S as ScopedCallback, j as Zone, Z as ZoneAggregator, k as ZoneHistory, l as asyncZone, c as cleanup, m as formatCleanupReason, n as isReactive, o as objectToProxy, p as proxyToObject, q as reactiveOptions, s as stopped, u as unwrap } from './types-W5vD6m2n.js';
1
+ export { ArrayDiffResult, ArrayReadForward, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, PromiseChain, ReactiveBase, Resource, Restorer, addBatchCleanup, addUnreactiveProps, allocated, allocatedValues, arrayDiff, arrayEquals, assertUntracked, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, captured, caught, chainPromise, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, isCached, isConstructor, isDev, isNonReactive, isObject, isProd, isTest, legacyDecorator, lift, link, memoize, mixin, modernDecorator, morph, named, onEffectThrow, organize, organized, profileInfo, morph as project, reactive, reset, resource, root, setAt, tag, throttle, touched, touched1, unlink, unreactive, untracked, watch, when, zip } from './index.js';
2
+ export { A as AZone, C as CleanupReason, c as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, G as GetterWrapper, H as HistoryValue, P as PropTrigger, R as ReactiveError, h as ReactiveErrorCode, S as ScopedCallback, i as Zone, Z as ZoneAggregator, j as ZoneHistory, k as asyncZone, l as debugPreset, m as devPreset, n as formatCleanupReason, o as isReactive, p as objectToProxy, q as prodPreset, r as proxyToObject, s as reactiveOptions, u as unwrap } from './types-Bx2PhORg.js';
package/dist/node.dev.cjs CHANGED
@@ -3,10 +3,10 @@
3
3
  require('./debug.cjs');
4
4
  require('./chunks/async-node-3PrbVAbB.cjs');
5
5
  var browser = require('./browser.cjs');
6
- var proxy = require('./chunks/proxy-Dtg-bJ3T.cjs');
6
+ var proxy = require('./chunks/proxy-Cc79Lrzj.cjs');
7
7
  var asyncCore = require('./chunks/async-core-CRLKP3l-.cjs');
8
8
  require('node:async_hooks');
9
- require('./chunks/async-browser-BU_IfxYD.cjs');
9
+ require('./chunks/async-browser-Dgr5CreQ.cjs');
10
10
 
11
11
 
12
12
 
@@ -15,7 +15,6 @@ exports.Destroyable = browser.Destroyable;
15
15
  exports.DestructionError = browser.DestructionError;
16
16
  exports.Eventful = browser.Eventful;
17
17
  exports.Indexable = browser.Indexable;
18
- exports.Register = browser.Register;
19
18
  exports.allocated = browser.allocated;
20
19
  exports.allocatedValues = browser.allocatedValues;
21
20
  exports.arrayDiff = browser.arrayDiff;
@@ -39,9 +38,7 @@ exports.organize = browser.organize;
39
38
  exports.organized = browser.organized;
40
39
  exports.profileInfo = browser.profileInfo;
41
40
  exports.project = browser.morph;
42
- exports.register = browser.register;
43
41
  exports.resource = browser.resource;
44
- exports.scan = browser.scan;
45
42
  exports.setAt = browser.setAt;
46
43
  exports.throttle = browser.throttle;
47
44
  exports.unreactive = browser.unreactive;
@@ -61,18 +58,21 @@ exports.Zone = proxy.Zone;
61
58
  exports.ZoneAggregator = proxy.ZoneAggregator;
62
59
  exports.ZoneHistory = proxy.ZoneHistory;
63
60
  exports.addBatchCleanup = proxy.addBatchCleanup;
61
+ exports.addUnreactiveProps = proxy.addUnreactiveProps;
64
62
  exports.arrayEquals = proxy.arrayEquals;
63
+ exports.assertUntracked = proxy.assertUntracked;
65
64
  exports.asyncZone = proxy.asyncZone;
66
65
  exports.atom = proxy.atom;
67
66
  exports.atomic = proxy.atomic;
68
67
  exports.biDi = proxy.biDi;
68
+ exports.captured = proxy.captured;
69
69
  exports.caught = proxy.caught;
70
- exports.cleanedBy = proxy.cleanedBy;
71
- exports.cleanup = proxy.cleanup;
72
70
  exports.createFlavor = proxy.createFlavor;
71
+ exports.debugPreset = proxy.debugPreset;
73
72
  exports.decorator = proxy.decorator;
74
73
  exports.deepCompare = proxy.deepCompare;
75
74
  exports.defer = proxy.defer;
75
+ exports.devPreset = proxy.devPreset;
76
76
  exports.effect = proxy.effect;
77
77
  exports.effectAggregator = proxy.effectAggregator;
78
78
  exports.flavorOptions = proxy.flavorOptions;
@@ -81,26 +81,30 @@ exports.formatCleanupReason = proxy.formatCleanupReason;
81
81
  exports.getActivationLog = proxy.getActivationLog;
82
82
  exports.getActiveEffect = proxy.getActiveEffect;
83
83
  exports.getState = proxy.getState;
84
- exports.immutables = proxy.immutables;
85
84
  exports.isConstructor = proxy.isConstructor;
85
+ exports.isDev = proxy.isDev;
86
86
  exports.isNonReactive = proxy.isNonReactive;
87
87
  exports.isObject = proxy.isObject;
88
+ exports.isProd = proxy.isProd;
88
89
  exports.isReactive = proxy.isReactive;
90
+ exports.isTest = proxy.isTest;
89
91
  exports.legacyDecorator = proxy.legacyDecorator;
92
+ exports.link = proxy.link;
90
93
  exports.mixin = proxy.mixin;
91
94
  exports.modernDecorator = proxy.modernDecorator;
92
95
  exports.named = proxy.named;
93
96
  exports.objectToProxy = proxy.objectToProxy;
94
97
  exports.onEffectThrow = proxy.onEffectThrow;
98
+ exports.prodPreset = proxy.prodPreset;
95
99
  exports.proxyToObject = proxy.proxyToObject;
96
100
  exports.reactive = proxy.reactive;
97
101
  exports.reactiveOptions = proxy.options;
98
102
  exports.reset = proxy.reset;
99
103
  exports.root = proxy.root;
100
- exports.stopped = proxy.stopped;
101
104
  exports.tag = proxy.tag;
102
105
  exports.touched = proxy.touched;
103
106
  exports.touched1 = proxy.touched1;
107
+ exports.unlink = proxy.unlink;
104
108
  exports.untracked = proxy.untracked;
105
109
  exports.unwrap = proxy.unwrap;
106
110
  exports.zip = proxy.zip;
@@ -1 +1 @@
1
- {"version":3,"file":"node.dev.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"node.dev.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- export { A as AZone, h as CleanupReason, e as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, F as FunctionWrapper, P as PropTrigger, R as ReactiveError, i as ReactiveErrorCode, S as ScopedCallback, j as Zone, Z as ZoneAggregator, k as ZoneHistory, l as asyncZone, c as cleanup, m as formatCleanupReason, n as isReactive, o as objectToProxy, p as proxyToObject, q as reactiveOptions, s as stopped, u as unwrap } from './types-W5vD6m2n.js';
2
- export { ArrayDiffResult, ArrayReadForward, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, PromiseChain, ReactiveBase, Register, Resource, Restorer, ScanResult, addBatchCleanup, allocated, allocatedValues, arrayDiff, arrayEquals, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, caught, chainPromise, cleanedBy, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, immutables, isCached, isConstructor, isNonReactive, isObject, legacyDecorator, lift, memoize, mixin, modernDecorator, morph, named, onEffectThrow, organize, organized, profileInfo, morph as project, reactive, register, reset, resource, root, scan, setAt, tag, throttle, touched, touched1, unreactive, untracked, watch, when, zip } from './index.js';
1
+ export { A as AZone, C as CleanupReason, c as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, G as GetterWrapper, H as HistoryValue, P as PropTrigger, R as ReactiveError, h as ReactiveErrorCode, S as ScopedCallback, i as Zone, Z as ZoneAggregator, j as ZoneHistory, k as asyncZone, l as debugPreset, m as devPreset, n as formatCleanupReason, o as isReactive, p as objectToProxy, q as prodPreset, r as proxyToObject, s as reactiveOptions, u as unwrap } from './types-Bx2PhORg.js';
2
+ export { ArrayDiffResult, ArrayReadForward, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, PromiseChain, ReactiveBase, Resource, Restorer, addBatchCleanup, addUnreactiveProps, allocated, allocatedValues, arrayDiff, arrayEquals, assertUntracked, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, captured, caught, chainPromise, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, isCached, isConstructor, isDev, isNonReactive, isObject, isProd, isTest, legacyDecorator, lift, link, memoize, mixin, modernDecorator, morph, named, onEffectThrow, organize, organized, profileInfo, morph as project, reactive, reset, resource, root, setAt, tag, throttle, touched, touched1, unlink, unreactive, untracked, watch, when, zip } from './index.js';
@@ -1,6 +1,6 @@
1
1
  import './debug.esm.js';
2
- import './chunks/node-nKJBk8iJ.esm.js';
3
- export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, R as Register, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, t as project, x as register, y as resource, z as scan, B as setAt, C as throttle, F as unreactive, G as watch, H as when } from './chunks/index-CaaQQlPJ.esm.js';
4
- export { A as AZone, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as arrayEquals, h as asyncHook, i as asyncHooks, j as asyncZone, k as atom, l as atomic, m as biDi, n as caught, o as cleanedBy, p as cleanup, q as createFlavor, r as decorator, s as deepCompare, t as defer, u as effect, v as effectAggregator, w as flavorOptions, x as flavored, y as formatCleanupReason, z as getActivationLog, B as getActiveEffect, C as getState, E as hooks, F as immutables, G as isConstructor, H as isNonReactive, J as isObject, K as isReactive, L as legacyDecorator, M as mixin, N as modernDecorator, O as named, P as objectToProxy, Q as onEffectThrow, S as proxyToObject, T as reactive, U as reactiveOptions, V as reset, W as root, X as stopped, Y as tag, _ as touched, $ as touched1, a0 as untracked, a1 as unwrap, a2 as zip } from './chunks/proxy-r7lARftl.esm.js';
2
+ import './chunks/node-Bo7WU5S2.esm.js';
3
+ export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, t as project, x as resource, y as setAt, z as throttle, B as unreactive, C as watch, F as when } from './chunks/index-Sf74wXTV.esm.js';
4
+ export { A as AZone, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as addUnreactiveProps, h as arrayEquals, i as assertUntracked, j as asyncHook, k as asyncHooks, l as asyncZone, m as atom, n as atomic, o as biDi, p as captured, q as caught, r as createFlavor, s as debugPreset, t as decorator, u as deepCompare, v as defer, w as devPreset, x as effect, y as effectAggregator, z as flavorOptions, B as flavored, C as formatCleanupReason, E as getActivationLog, F as getActiveEffect, G as getState, H as hooks, J as isConstructor, K as isDev, L as isNonReactive, M as isObject, N as isProd, O as isReactive, P as isTest, Q as legacyDecorator, S as link, T as mixin, U as modernDecorator, V as named, W as objectToProxy, X as onEffectThrow, Y as prodPreset, _ as proxyToObject, $ as reactive, a0 as reactiveOptions, a1 as reset, a2 as root, a3 as tag, a4 as touched, a5 as touched1, a6 as unlink, a7 as untracked, a8 as unwrap, a9 as zip } from './chunks/proxy-D2C49sXH.esm.js';
5
5
  import 'node:async_hooks';
6
6
  //# sourceMappingURL=node.dev.esm.js.map
package/dist/node.esm.js CHANGED
@@ -1,5 +1,5 @@
1
- import './chunks/node-nKJBk8iJ.esm.js';
2
- export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, R as Register, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, t as project, x as register, y as resource, z as scan, B as setAt, C as throttle, F as unreactive, G as watch, H as when } from './chunks/index-CaaQQlPJ.esm.js';
3
- export { A as AZone, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as arrayEquals, h as asyncHook, i as asyncHooks, j as asyncZone, k as atom, l as atomic, m as biDi, n as caught, o as cleanedBy, p as cleanup, q as createFlavor, r as decorator, s as deepCompare, t as defer, u as effect, v as effectAggregator, w as flavorOptions, x as flavored, y as formatCleanupReason, z as getActivationLog, B as getActiveEffect, C as getState, E as hooks, F as immutables, G as isConstructor, H as isNonReactive, J as isObject, K as isReactive, L as legacyDecorator, M as mixin, N as modernDecorator, O as named, P as objectToProxy, Q as onEffectThrow, S as proxyToObject, T as reactive, U as reactiveOptions, V as reset, W as root, X as stopped, Y as tag, _ as touched, $ as touched1, a0 as untracked, a1 as unwrap, a2 as zip } from './chunks/proxy-r7lARftl.esm.js';
1
+ import './chunks/node-Bo7WU5S2.esm.js';
2
+ export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, t as project, x as resource, y as setAt, z as throttle, B as unreactive, C as watch, F as when } from './chunks/index-Sf74wXTV.esm.js';
3
+ export { A as AZone, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as addUnreactiveProps, h as arrayEquals, i as assertUntracked, j as asyncHook, k as asyncHooks, l as asyncZone, m as atom, n as atomic, o as biDi, p as captured, q as caught, r as createFlavor, s as debugPreset, t as decorator, u as deepCompare, v as defer, w as devPreset, x as effect, y as effectAggregator, z as flavorOptions, B as flavored, C as formatCleanupReason, E as getActivationLog, F as getActiveEffect, G as getState, H as hooks, J as isConstructor, K as isDev, L as isNonReactive, M as isObject, N as isProd, O as isReactive, P as isTest, Q as legacyDecorator, S as link, T as mixin, U as modernDecorator, V as named, W as objectToProxy, X as onEffectThrow, Y as prodPreset, _ as proxyToObject, $ as reactive, a0 as reactiveOptions, a1 as reset, a2 as root, a3 as tag, a4 as touched, a5 as touched1, a6 as unlink, a7 as untracked, a8 as unwrap, a9 as zip } from './chunks/proxy-D2C49sXH.esm.js';
4
4
  import 'node:async_hooks';
5
5
  //# sourceMappingURL=node.esm.js.map
@@ -4,9 +4,9 @@ declare abstract class AZone<T> {
4
4
  protected leave(entered: unknown): void;
5
5
  with<R>(value: T | undefined, fn: () => R): R;
6
6
  root<R>(fn: () => R): R;
7
- get zoned(): FunctionWrapper;
7
+ get zoned(): GetterWrapper;
8
8
  }
9
- type FunctionWrapper = <R>(fn: () => R) => R;
9
+ type GetterWrapper = <R>(fn: () => R) => R;
10
10
  declare class Zone<T> extends AZone<T> {
11
11
  active: T | undefined;
12
12
  }
@@ -35,6 +35,17 @@ declare class ZoneAggregator extends AZone<Map<AZone<unknown>, unknown>> {
35
35
  delete(z: AZone<unknown>): void;
36
36
  clear(): void;
37
37
  }
38
+ /**
39
+ * Aggregator of zones that should be preserved across async boundaries.
40
+ * If you add a zone here, it will be preserved across async boundaries.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { Zone, asyncZone } from 'mutts'
45
+ * const userZone = new Zone<User>()
46
+ * asyncZone.add(userZone)
47
+ * ```
48
+ */
38
49
  declare const asyncZone: ZoneAggregator;
39
50
 
40
51
  /**
@@ -54,7 +65,7 @@ interface EffectAccess {
54
65
  * })
55
66
  * ```
56
67
  */
57
- tracked: FunctionWrapper;
68
+ tracked: GetterWrapper;
58
69
  /**
59
70
  * Tracks dependencies in the parent effect context
60
71
  * Use this when child effects should track dependencies in the parent,
@@ -72,7 +83,7 @@ interface EffectAccess {
72
83
  * })
73
84
  * ```
74
85
  */
75
- ascend: FunctionWrapper;
86
+ ascend: GetterWrapper;
76
87
  /**
77
88
  * `false` on the first execution, `true` or `CleanupReason` on subsequent runs.
78
89
  * `true` means this is a re-run but detailed reason gathering is disabled or unavailable.
@@ -91,6 +102,11 @@ interface EffectAccess {
91
102
  * ```
92
103
  */
93
104
  reaction: boolean | CleanupReason;
105
+ /**
106
+ * AbortSignal that is aborted when the effect is cleaned up or re-runs.
107
+ * Use this to cancel async operations (like fetch) when the effect is no longer valid.
108
+ */
109
+ signal: AbortSignal;
94
110
  }
95
111
  /**
96
112
  * Base type for effect callbacks - simple function without additional properties
@@ -113,6 +129,7 @@ type CleanupReason = {
113
129
  cause: CleanupReason;
114
130
  } | {
115
131
  type: 'stopped';
132
+ detail?: string;
116
133
  } | {
117
134
  type: 'gc';
118
135
  } | {
@@ -139,11 +156,9 @@ type CleanupReason = {
139
156
  */
140
157
  declare function formatCleanupReason(reason: CleanupReason, depth?: number): unknown[];
141
158
  /**
142
- * Type for effect cleanup functions with stopped state tracking
159
+ * Type for effect cleanup functions.
143
160
  */
144
- type EffectCleanup = ScopedCallback & {
145
- [stopped]: boolean;
146
- };
161
+ type EffectCleanup = ScopedCallback;
147
162
  /**
148
163
  * Type for the `runEffect` function of an effect - argument-less function to call to trigger the effect
149
164
  */
@@ -198,16 +213,8 @@ type State = {
198
213
  evolution: Evolution;
199
214
  next: State;
200
215
  } | {};
201
- /**
202
- * Symbol to check if an effect is stopped
203
- */
204
- declare const stopped: unique symbol;
205
- /**
206
- * Symbol to access effect cleanup function
207
- */
208
- declare const cleanup: unique symbol;
209
216
  type EffectCloser = (reason?: CleanupReason) => void;
210
- type CatchFunction = (error: any) => EffectCloser | undefined | void;
217
+ type CatchFunction = (error: unknown) => EffectCloser | undefined | void;
211
218
  /**
212
219
  * Structured error codes for machine-readable diagnosis
213
220
  */
@@ -304,6 +311,12 @@ declare const options: {
304
311
  * @param runningChain - The array of effects from the detected one to the currently running one
305
312
  */
306
313
  skipRunningEffect: (_effect: EffectTrigger) => void;
314
+ /**
315
+ * Debug purpose: called when an effect starts executing.
316
+ * @param effect - The effect being executed (root function)
317
+ * @param reaction - false for initial creation, true/CleanupReason for subsequent runs
318
+ */
319
+ effectRun: (_effect: Function, _reaction: boolean | CleanupReason) => void;
307
320
  /**
308
321
  * Debug purpose: maximum effect chain (like call stack max depth)
309
322
  * Used to prevent infinite loops
@@ -431,39 +444,17 @@ declare const options: {
431
444
  enableHistory: boolean;
432
445
  historySize: number;
433
446
  } | null;
434
- /**
435
- * Configuration for zone hooks - control which async APIs are hooked
436
- * Each option controls whether the corresponding async API is wrapped to preserve effect context
437
- * Only applies when asyncMode is enabled (truthy)
438
- * @deprecated Should take all when we made sure PIXI.create, Game.create, ... are -> .root()
439
- */
440
- zones: {
441
- /**
442
- * Hook setTimeout to preserve effect context
443
- * @default true
444
- */
445
- setTimeout: boolean;
446
- /**
447
- * Hook setInterval to preserve effect context
448
- * @default true
449
- */
450
- setInterval: boolean;
451
- /**
452
- * Hook requestAnimationFrame (runs in untracked context when hooked)
453
- * @default true
454
- */
455
- requestAnimationFrame: boolean;
456
- /**
457
- * Hook queueMicrotask to preserve effect context
458
- * @default true
459
- */
460
- queueMicrotask: boolean;
461
- };
462
447
  };
448
+ /** Production preset: no introspection, heuristic cycle detection, minimal overhead */
449
+ declare const prodPreset: Partial<typeof options>;
450
+ /** Development preset (default): introspection on, early cycle detection, warnings */
451
+ declare const devPreset: Partial<typeof options>;
452
+ /** Debug preset: full diagnostics, throws on violations, rich lineage capture */
453
+ declare const debugPreset: Partial<typeof options>;
463
454
  declare const objectToProxy: WeakMap<object, object>;
464
455
  declare const proxyToObject: WeakMap<object, object>;
465
456
  declare function unwrap<T>(obj: T): T;
466
457
  declare function isReactive(obj: any): boolean;
467
458
 
468
- export { AZone as A, ReactiveError as R, ZoneAggregator as Z, cleanup as c, ReactiveErrorCode as i, Zone as j, ZoneHistory as k, asyncZone as l, formatCleanupReason as m, isReactive as n, objectToProxy as o, proxyToObject as p, options as q, stopped as s, unwrap as u };
469
- export type { CatchFunction as C, EffectTrigger as E, FunctionWrapper as F, PropTrigger as P, ScopedCallback as S, Evolution as a, EffectCleanup as b, EffectCloser as d, EffectAccess as e, State as f, EffectOptions as g, CleanupReason as h };
459
+ export { AZone as A, ReactiveError as R, ZoneAggregator as Z, ReactiveErrorCode as h, Zone as i, ZoneHistory as j, asyncZone as k, debugPreset as l, devPreset as m, formatCleanupReason as n, isReactive as o, objectToProxy as p, prodPreset as q, proxyToObject as r, options as s, unwrap as u };
460
+ export type { CleanupReason as C, EffectTrigger as E, GetterWrapper as G, HistoryValue as H, PropTrigger as P, ScopedCallback as S, Evolution as a, EffectCleanup as b, EffectAccess as c, EffectCloser as d, State as e, CatchFunction as f, EffectOptions as g };
@@ -55,20 +55,6 @@ export declare function biDi<T>(target: (val: T) => void, source: { get: () => T
55
55
  // COLLECTIONS
56
56
  // --------------------------------------------------------------------------------
57
57
 
58
- export interface Register<T, K extends PropertyKey = PropertyKey> extends Iterable<T> {
59
- length: number;
60
- [index: number]: T;
61
- get(key: K): T | undefined;
62
- set(key: K, value: T): void;
63
- hasKey(key: K): boolean;
64
- indexOfKey(key: K): number;
65
- remove(key: K): void;
66
- removeAt(index: number): T | undefined;
67
- push(...items: T[]): number;
68
- // ... complete array methods are supported
69
- }
70
-
71
- export declare function register<T, K extends PropertyKey = PropertyKey>(keyFn: (item: T) => K, initial?: Iterable<T>): Register<T, K>;
72
58
  export declare function project<S, R>(source: S, apply: (access: any, target: any) => any): R;
73
59
  export declare function organized<S, T>(source: S, apply: (access: any, target: T) => any, baseTarget?: T): T;
74
60
 
package/docs/ai/manual.md CHANGED
@@ -21,9 +21,9 @@ Proxy-based **fine-grained reactivity** — changes propagate synchronously thro
21
21
  **All exports come from `'mutts'`** — no subpath imports like `mutts/reactive` or `mutts/zone`.
22
22
 
23
23
  ```ts
24
- import { reactive, effect, memoize, morph, attend, lift, scan, cleanup,
24
+ import { reactive, effect, memoize, morph, attend, lift, cleanup,
25
25
  atom, atomic, defer, untracked, unreactive, watch, when, biDi, caught, why,
26
- cleanedBy, organized, Register,
26
+ cleanedBy, organized,
27
27
  Zone, asyncZone, ZoneHistory, ZoneAggregator,
28
28
  decorator, mixin, Eventful, Destroyable, flavored, Indexable, chainPromise,
29
29
  reactiveOptions, isReactive, unwrap, getState
@@ -274,18 +274,6 @@ await when(() => state.ready, { timeout: 5000 }) // rejects after 5s
274
274
 
275
275
  Array methods (`push`, `splice`, `sort`, etc.) all trigger reactivity.
276
276
 
277
- ### 4.1 Register — Keyed ordered collection
278
-
279
- ```ts
280
- const list = new Register(item => item.id, [{ id: 1, label: 'A' }])
281
- list.get(1) // O(1) lookup by key
282
- list.set(1, newItem) // update by key
283
- list.remove(1) // remove by key
284
- list.keep(x => x.active) // filter in-place
285
- list.upsert(v => list.push(v), ...items) // update or insert
286
- // Full array surface + CRUD events: on('add'|'delete'|'update'|'rekey', ...)
287
- ```
288
-
289
277
  ---
290
278
 
291
279
  ## 5. COLLECTION TRANSFORMS
@@ -321,14 +309,6 @@ const doubled = organized(source, (access, target) => {
321
309
  })
322
310
  ```
323
311
 
324
- ### 5.4 scan() — Reactive accumulation
325
-
326
- ```ts
327
- const result = scan(source, (acc, item) => acc + item.val, 0)
328
- // [1, 3, 6] — changing source[1] recomputes from index 1 onward
329
- // Items must be objects (WeakMap keys). Move-optimized.
330
- ```
331
-
332
312
  ### 5.6 lift() — Sync a computed array/object
333
313
 
334
314
  ```ts
@@ -5,7 +5,7 @@
5
5
  The `atomic` function wraps a function to batch all reactive effects triggered within it, ensuring effects run only once after the function completes. It can be used both as a function wrapper and as a decorator.
6
6
 
7
7
  ```typescript
8
- import { atomic, reactive, effect } from 'mutts/reactive'
8
+ import { atomic, reactive, effect } from 'mutts'
9
9
 
10
10
  const state = reactive({ a: 0, b: 0 })
11
11
 
@@ -48,7 +48,7 @@ The wrapped function preserves its signature (parameters and return value), and
48
48
  While `atomic()` **wraps** a function for later calls, `atom()` **runs** a function immediately and atomically. It always executes right away, even inside a nested batch.
49
49
 
50
50
  ```typescript
51
- import { atom, reactive, effect } from 'mutts/reactive'
51
+ import { atom, reactive, effect } from 'mutts'
52
52
 
53
53
  const state = reactive({ a: 0, b: 0 })
54
54
 
@@ -85,9 +85,9 @@ update(1, 2) // runs when called
85
85
  When an effect needs to perform an action that would modify state the effect depends on, this can create a reactive cycle. The `addBatchCleanup` function (also exported as `defer` for semantic clarity) allows you to defer such work until after the current batch of effects completes.
86
86
 
87
87
  ```typescript
88
- import { addBatchCleanup, effect, reactive } from 'mutts/reactive'
88
+ import { addBatchCleanup, effect, reactive } from 'mutts'
89
89
  // or use the semantic alias:
90
- // import { defer } from 'mutts/reactive'
90
+ // import { defer } from 'mutts'
91
91
 
92
92
  const state = reactive({
93
93
  items: [],
@@ -298,7 +298,7 @@ effect(() => {
298
298
  Creates a bidirectional binding between a reactive value and a non-reactive external value (like DOM elements), automatically preventing infinite loops.
299
299
 
300
300
  ```typescript
301
- import { biDi, reactive } from 'mutts/reactive'
301
+ import { biDi, reactive } from 'mutts'
302
302
 
303
303
  const model = reactive({ value: '' })
304
304
 
@@ -1142,15 +1142,14 @@ Mutts provides several ways to derive values from reactive state. They differ in
1142
1142
  | `lift(() => ({...}))` | Eager | Reactive object proxy | Yes (per-prop) | **Yes** | `result[cleanup]()` | Derived objects, computed shapes |
1143
1143
  | `morph(source, fn)` | **Lazy** | Reactive proxy | Yes (per-key) | **Yes** | `cleanedBy` | Lazy per-element map with identity tracking |
1144
1144
  | `morph.pure(source, fn)` | **Lazy** | Reactive proxy | Yes (per-key) | **Yes** | `cleanedBy` | Same, but skips per-item dependency tracking |
1145
- | `scan(source, fn, init)` | Eager | Reactive array | Yes (per-index) | **Yes** | `result[cleanup]()` | Running accumulations (prefix sums) |
1146
1145
  | `when(() => cond)` | Eager | Promise\<T\> | N/A | N/A | Auto (on resolve/timeout) | Awaiting a reactive condition |
1147
1146
  | `watch(source, cb)` | Eager | Callback (old/new) | N/A | N/A | Auto (parent/GC) + Returned cleanup | Observing specific changes |
1148
1147
 
1149
1148
  ### Key distinctions
1150
1149
 
1151
1150
  - **Lazy vs Eager**: `memoize` only recomputes when the result is read. Everything else recomputes immediately when dependencies change — even if nobody is consuming the output.
1152
- - **Trackable**: Can downstream effects depend on the result? `memoize`'s return value is trackable because calling it runs inside an effect context. `lift`/`morph`/`scan` return reactive proxies where each property/index is independently trackable.
1153
- - **Identity stable**: `lift`, `morph`, and `scan` return the **same proxy** across recomputations — only changed slots are updated. This is critical for downstream transformations or DOM reconciliation that relies on reference identity.
1151
+ - **Trackable**: Can downstream effects depend on the result? `memoize`'s return value is trackable because calling it runs inside an effect context. `lift`/`morph` return reactive proxies where each property/index is independently trackable.
1152
+ - **Identity stable**: `lift` and `morph` return the **same proxy** across recomputations — only changed slots are updated. This is critical for downstream transformations or DOM reconciliation that relies on reference identity.
1154
1153
 
1155
1154
  ### Common patterns
1156
1155
 
@@ -1229,7 +1228,7 @@ state.items = fetchedItems // deep touch diffs old vs new per-index — no lift
1229
1228
  **Signature**
1230
1229
 
1231
1230
  ```typescript
1232
- import { morph } from 'mutts/reactive'
1231
+ import { morph } from 'mutts'
1233
1232
 
1234
1233
  function morph<I, O>(
1235
1234
  source: readonly I[] | (() => readonly I[]),
@@ -1254,7 +1253,7 @@ function morph<I, O>(
1254
1253
  **Basic usage**
1255
1254
 
1256
1255
  ```typescript
1257
- import { morph, reactive, effect } from 'mutts/reactive'
1256
+ import { morph, reactive, effect } from 'mutts'
1258
1257
 
1259
1258
  const items = reactive(['alice', 'bob', 'charlie'])
1260
1259
  const upper = morph(items, name => name.toUpperCase())
@@ -1355,7 +1354,7 @@ pure[0] // 10 — stale, no per-item effect to invalidate
1355
1354
  **Signature**
1356
1355
 
1357
1356
  ```typescript
1358
- import { memoize } from 'mutts/reactive'
1357
+ import { memoize } from 'mutts'
1359
1358
 
1360
1359
  type Memoizable = object | any[] | symbol
1361
1360
 
@@ -1380,7 +1379,7 @@ function memoize<Result>(
1380
1379
  **Basic usage**
1381
1380
 
1382
1381
  ```typescript
1383
- import { effect, memoize, reactive } from 'mutts/reactive'
1382
+ import { effect, memoize, reactive } from 'mutts'
1384
1383
 
1385
1384
  const source = reactive({ value: 1 })
1386
1385
  const args = { node: source }
@@ -1426,7 +1425,7 @@ Use `maxArgs` when the memoized function should only consider the first _n_ argu
1426
1425
  A flavored variant that gracefully handles non-WeakKey arguments (primitives, `null`, `undefined`). Instead of throwing, it falls back to recomputing the function without caching.
1427
1426
 
1428
1427
  ```typescript
1429
- import { memoize } from 'mutts/reactive'
1428
+ import { memoize } from 'mutts'
1430
1429
 
1431
1430
  const process = memoize.lenient((value: string | { data: string }) => {
1432
1431
  return typeof value === 'string' ? value.toUpperCase() : value.data
@@ -1447,7 +1446,7 @@ This is useful when a memoized function may receive both objects and primitives,
1447
1446
  Apply `@memoize` (or `@memoize.lenient`) to class getters or methods to share the same cache semantics. Getters cache per instance; methods cache per instance and argument tuple.
1448
1447
 
1449
1448
  ```typescript
1450
- import { memoize, reactive } from 'mutts/reactive'
1449
+ import { memoize, reactive } from 'mutts'
1451
1450
 
1452
1451
  class Example {
1453
1452
  state = reactive({ count: 0 })
@@ -137,6 +137,5 @@ attend(
137
137
  | `attend` | — | Reactive lifecycle per key |
138
138
  | `organized` | ✅ | Reactive record mapping with access objects |
139
139
  | `project` | ❌ | Reactive collection mapping (manages a target + projection context) |
140
- | `scan` | ❌ | Reactive accumulation (sequential key dependency) |
141
140
 
142
- `project` and `scan` have additional concerns (target management, sequential dependencies) that go beyond `attend`'s independent-key lifecycle model.
141
+ `project` has additional concerns (target management) that go beyond `attend`'s independent-key lifecycle model.