@zeix/cause-effect 1.1.0 → 1.1.1
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/{skills → .claude/skills}/cause-effect/references/api-facts.md +23 -7
- package/{skills → .claude/skills}/cause-effect/references/non-obvious-behaviors.md +4 -4
- package/{skills → .claude/skills}/cause-effect/references/signal-types.md +19 -7
- package/{skills → .claude/skills}/cause-effect-dev/references/api-facts.md +5 -3
- package/{skills → .claude/skills}/cause-effect-dev/references/non-obvious-behaviors.md +4 -4
- package/CHANGELOG.md +6 -0
- package/GUIDE.md +3 -3
- package/README.md +1 -1
- package/index.dev.js +2 -0
- package/index.js +1 -1
- package/index.ts +1 -1
- package/package.json +1 -1
- package/src/nodes/slot.ts +8 -4
- package/test/slot.test.ts +19 -0
- package/types/index.d.ts +1 -1
- package/types/src/nodes/slot.d.ts +7 -3
- /package/{skills → .claude/skills}/cause-effect/SKILL.md +0 -0
- /package/{skills → .claude/skills}/cause-effect/agents/openai.yaml +0 -0
- /package/{skills → .claude/skills}/cause-effect/references/error-classes.md +0 -0
- /package/{skills → .claude/skills}/cause-effect/workflows/answer-question.md +0 -0
- /package/{skills → .claude/skills}/cause-effect/workflows/debug.md +0 -0
- /package/{skills → .claude/skills}/cause-effect/workflows/use-api.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/SKILL.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/agents/openai.yaml +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/references/error-classes.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/references/internal-types.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/references/source-map.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/workflows/answer-question.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/workflows/fix-bug.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/workflows/implement-feature.md +0 -0
- /package/{skills → .claude/skills}/cause-effect-dev/workflows/write-tests.md +0 -0
- /package/{skills → .claude/skills}/changelog-keeper/SKILL.md +0 -0
- /package/{skills → .claude/skills}/changelog-keeper/agents/openai.yaml +0 -0
- /package/{skills → .claude/skills}/tech-writer/SKILL.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/references/document-map.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/references/tone-guide.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/workflows/consistency-review.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/workflows/update-after-change.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/workflows/update-agent-docs.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/workflows/update-architecture.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/workflows/update-jsdoc.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/workflows/update-public-api.md +0 -0
- /package/{skills → .claude/skills}/tech-writer/workflows/update-requirements.md +0 -0
|
@@ -139,22 +139,38 @@ const results = createTask(async (prev, signal) => {
|
|
|
139
139
|
```
|
|
140
140
|
|
|
141
141
|
**`Slot` is a property descriptor**
|
|
142
|
-
- Has `get`, `set`, `configurable`, `enumerable` fields
|
|
143
|
-
-
|
|
142
|
+
- Has `get`, `set`, `configurable`, `enumerable` fields — pass directly to `Object.defineProperty()`
|
|
143
|
+
- Delegates reads and writes to a swappable backing signal; use `replace(nextSignal)` to swap
|
|
144
|
+
- Is a forwarding layer, not a value owner — has no `update()` method
|
|
144
145
|
|
|
145
146
|
```typescript
|
|
146
|
-
const
|
|
147
|
+
const nameState = createState('Alice')
|
|
148
|
+
const nameSlot = createSlot(nameState)
|
|
147
149
|
Object.defineProperty(element, 'name', nameSlot)
|
|
148
150
|
```
|
|
149
151
|
</callback_patterns>
|
|
150
152
|
|
|
151
153
|
<match_helper>
|
|
152
|
-
`match` reads one or more Sensor/Task signals and routes to `ok` or `
|
|
153
|
-
all signals have a value. Use it to safely handle the unset state without try/catch
|
|
154
|
+
`match` reads one or more Sensor/Task signals and routes to `ok`, `nil`, or `err` based on
|
|
155
|
+
whether all signals have a value. Use it to safely handle the unset state without try/catch.
|
|
156
|
+
|
|
157
|
+
**Single-signal form** — `ok` receives the value directly, `err` receives a single `Error`:
|
|
154
158
|
|
|
155
159
|
```typescript
|
|
156
160
|
import { match } from '@zeix/cause-effect'
|
|
157
161
|
|
|
162
|
+
createEffect(() => {
|
|
163
|
+
match(task, {
|
|
164
|
+
ok: data => render(data),
|
|
165
|
+
nil: () => showSpinner(),
|
|
166
|
+
err: error => showError(error),
|
|
167
|
+
})
|
|
168
|
+
})
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Tuple form** — for two or more signals; `ok` receives a typed tuple, `err` an `Error[]`:
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
158
174
|
createEffect(() => {
|
|
159
175
|
match([task, sensor], {
|
|
160
176
|
ok: ([taskResult, sensorValue]) => render(taskResult, sensorValue),
|
|
@@ -163,8 +179,8 @@ createEffect(() => {
|
|
|
163
179
|
})
|
|
164
180
|
```
|
|
165
181
|
|
|
166
|
-
Read signals you care about eagerly
|
|
167
|
-
See `non-obvious-behaviors.md → conditional-reads-delay-watched` for why.
|
|
182
|
+
Read all signals you care about eagerly in the signals argument — not inside individual
|
|
183
|
+
branches. See `non-obvious-behaviors.md → conditional-reads-delay-watched` for why.
|
|
168
184
|
</match_helper>
|
|
169
185
|
|
|
170
186
|
<lifecycle_summary>
|
|
@@ -70,8 +70,8 @@ fires on the first effect run:
|
|
|
70
70
|
// Bad — `derived` is only read after `task` resolves to `ok`
|
|
71
71
|
// `derived.watched` does not fire until the task has a value
|
|
72
72
|
createEffect(() => {
|
|
73
|
-
match(
|
|
74
|
-
ok:
|
|
73
|
+
match(task, {
|
|
74
|
+
ok: result => render(derived.get(), result),
|
|
75
75
|
nil: () => showSpinner(),
|
|
76
76
|
})
|
|
77
77
|
})
|
|
@@ -179,8 +179,8 @@ createEffect(() => {
|
|
|
179
179
|
|
|
180
180
|
// Correct — match handles the nil (unset) case explicitly
|
|
181
181
|
createEffect(() => {
|
|
182
|
-
match(
|
|
183
|
-
ok:
|
|
182
|
+
match(tick, {
|
|
183
|
+
ok: timestamp => console.log('tick:', timestamp),
|
|
184
184
|
nil: () => console.log('waiting for first tick…'),
|
|
185
185
|
})
|
|
186
186
|
})
|
|
@@ -115,12 +115,13 @@ const dispose = createScope(() => {
|
|
|
115
115
|
- You want property access (`element.name`) to participate in the reactive graph
|
|
116
116
|
|
|
117
117
|
**Key facts:**
|
|
118
|
-
- Has `get`, `set`, `configurable`, and `enumerable` fields
|
|
119
|
-
-
|
|
120
|
-
-
|
|
118
|
+
- Has `get`, `set`, `configurable`, and `enumerable` fields — pass directly to `Object.defineProperty`
|
|
119
|
+
- Delegates to a swappable backing signal (any signal type); use `replace(nextSignal)` to swap
|
|
120
|
+
- Forwarding layer only — has no `update()` method
|
|
121
121
|
|
|
122
122
|
```typescript
|
|
123
|
-
const
|
|
123
|
+
const nameState = createState('Alice')
|
|
124
|
+
const nameSlot = createSlot(nameState)
|
|
124
125
|
Object.defineProperty(element, 'name', nameSlot)
|
|
125
126
|
```
|
|
126
127
|
</Slot>
|
|
@@ -241,9 +242,20 @@ Sensor and Task start unset. Use `match` to handle all states in one expression:
|
|
|
241
242
|
|
|
242
243
|
```typescript
|
|
243
244
|
createEffect(() => {
|
|
244
|
-
match(
|
|
245
|
-
ok:
|
|
246
|
-
err:
|
|
245
|
+
match(task, {
|
|
246
|
+
ok: data => renderData(data),
|
|
247
|
+
err: error => renderError(error),
|
|
248
|
+
nil: () => renderSpinner(),
|
|
249
|
+
})
|
|
250
|
+
})
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
For two or more signals, use the tuple form — `ok` receives a typed tuple:
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
createEffect(() => {
|
|
257
|
+
match([task, sensor], {
|
|
258
|
+
ok: ([data, pos]) => render(data, pos),
|
|
247
259
|
nil: () => renderSpinner(),
|
|
248
260
|
})
|
|
249
261
|
})
|
|
@@ -72,11 +72,13 @@ const doubled = createMemo((prev) => {
|
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
**`Slot` is a property descriptor**
|
|
75
|
-
- Has `get`, `set`, `configurable`, `enumerable` fields
|
|
76
|
-
-
|
|
75
|
+
- Has `get`, `set`, `configurable`, `enumerable` fields — pass directly to `Object.defineProperty()`
|
|
76
|
+
- Delegates reads and writes to a swappable backing signal; use `replace(nextSignal)` to swap
|
|
77
|
+
- Is a forwarding layer, not a value owner — has no `update()` method
|
|
77
78
|
|
|
78
79
|
```typescript
|
|
79
|
-
const
|
|
80
|
+
const nameState = createState('Alice')
|
|
81
|
+
const slot = createSlot(nameState)
|
|
80
82
|
Object.defineProperty(element, 'name', slot)
|
|
81
83
|
```
|
|
82
84
|
|
|
@@ -55,8 +55,8 @@ Read all signals you care about eagerly — before any conditional logic — to
|
|
|
55
55
|
// Bad — `derived` is only read after `task` resolves to `ok`
|
|
56
56
|
// `derived.watched` does not fire until the task has a value
|
|
57
57
|
createEffect(() => {
|
|
58
|
-
match(
|
|
59
|
-
ok:
|
|
58
|
+
match(task, {
|
|
59
|
+
ok: result => render(derived.get(), result),
|
|
60
60
|
nil: () => showSpinner(),
|
|
61
61
|
})
|
|
62
62
|
})
|
|
@@ -149,8 +149,8 @@ createEffect(() => {
|
|
|
149
149
|
|
|
150
150
|
// Correct — match handles the nil (unset) case explicitly
|
|
151
151
|
createEffect(() => {
|
|
152
|
-
match(
|
|
153
|
-
ok:
|
|
152
|
+
match(sensor, {
|
|
153
|
+
ok: timestamp => console.log(timestamp),
|
|
154
154
|
nil: () => console.log('waiting for first value…'),
|
|
155
155
|
})
|
|
156
156
|
})
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.1.1
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- **`Slot.set()` now forwards through Slot-to-Slot chains**: Previously, writing to a Slot whose backing signal was itself a Slot threw `ReadonlySignalError` because `isMutableSignal` does not include `Slot` (by design — a Slot wrapping a read-only signal is not mutable). `set()` now recursively delegates to the next Slot in the chain, allowing the terminal backing signal to determine write permissions. Chains of arbitrary depth are resolved correctly.
|
|
8
|
+
|
|
3
9
|
## 1.1.0
|
|
4
10
|
|
|
5
11
|
### Added
|
package/GUIDE.md
CHANGED
|
@@ -184,10 +184,10 @@ Use `match()` inside effects to handle all states declaratively:
|
|
|
184
184
|
|
|
185
185
|
```ts
|
|
186
186
|
createEffect(() => {
|
|
187
|
-
match(
|
|
188
|
-
ok:
|
|
187
|
+
match(user, {
|
|
188
|
+
ok: data => console.log('User:', data),
|
|
189
189
|
nil: () => console.log('Loading...'),
|
|
190
|
-
err:
|
|
190
|
+
err: error => console.error(error)
|
|
191
191
|
})
|
|
192
192
|
})
|
|
193
193
|
```
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Cause & Effect
|
|
2
2
|
|
|
3
|
-
Version 1.1.
|
|
3
|
+
Version 1.1.1
|
|
4
4
|
|
|
5
5
|
**Cause & Effect** is a reactive state management primitives library for TypeScript. It provides the foundational building blocks for managing complex, dynamic, composite, and asynchronous state — correctly and performantly — in a unified signal graph.
|
|
6
6
|
|
package/index.dev.js
CHANGED
|
@@ -1607,6 +1607,8 @@ function createSlot(initialSignal, options) {
|
|
|
1607
1607
|
return node.value;
|
|
1608
1608
|
};
|
|
1609
1609
|
const set = (next) => {
|
|
1610
|
+
if (isSlot(delegated))
|
|
1611
|
+
return delegated.set(next);
|
|
1610
1612
|
if (!isMutableSignal(delegated))
|
|
1611
1613
|
throw new ReadonlySignalError(TYPE_SLOT);
|
|
1612
1614
|
validateSignalValue(TYPE_SLOT, next, guard);
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function g($){return typeof $==="function"}function o($){return g($)&&$.constructor.name==="AsyncFunction"}function X$($){return g($)&&$.constructor.name!=="AsyncFunction"}function Y($,J){return Object.prototype.toString.call($)===`[object ${J}]`}function E($){return Y($,"Object")}function Y$($,J=(z)=>z!=null){return Array.isArray($)&&$.every(J)}function D$($){return typeof $==="string"?`"${$}"`:!!$&&typeof $==="object"?JSON.stringify($):String($)}class Z$ extends Error{constructor($){super(`[${$}] Circular dependency detected`);this.name="CircularDependencyError"}}class A$ extends TypeError{constructor($){super(`[${$}] Signal value cannot be null or undefined`);this.name="NullishSignalValueError"}}class i extends Error{constructor($){super(`[${$}] Signal value is unset`);this.name="UnsetSignalValueError"}}class j$ extends TypeError{constructor($,J){super(`[${$}] Signal value ${D$(J)} is invalid`);this.name="InvalidSignalValueError"}}class b$ extends TypeError{constructor($,J){super(`[${$}] Callback ${D$(J)} is invalid`);this.name="InvalidCallbackError"}}class P$ extends Error{constructor($){super(`[${$}] Signal is read-only`);this.name="ReadonlySignalError"}}class G$ extends Error{constructor($){super(`[${$}] Active owner is required`);this.name="RequiredOwnerError"}}class e extends Error{constructor($,J,z){super(`[${$}] Could not add key "${J}"${z?` with value ${JSON.stringify(z)}`:""} because it already exists`);this.name="DuplicateKeyError"}}function C($,J,z){if(J==null)throw new A$($);if(z&&!z(J))throw new j$($,J)}function W$($,J){if(J==null)throw new i($)}function S($,J,z=g){if(!z(J))throw new b$($,J)}var c="State",u="Memo",d="Task",t="Sensor",L="List",s="Collection",r="Store",l="Slot",p=0,$$=1,G=2,U$=4,b=8,V=null,_=null,C$=[],O=0,_$=!1,k=($,J)=>$===J,L$=($,J)=>!1;function g$($,J){let z=J.sourcesTail;if(z){let X=J.sources;while(X){if(X===$)return!0;if(X===z)break;X=X.nextSource}}return!1}function F($,J){let z=J.sourcesTail;if(z?.source===$)return;let X=null,W=J.flags&U$;if(W){if(X=z?z.nextSource:J.sources,X?.source===$){J.sourcesTail=X;return}}let B=$.sinksTail;if(B?.sink===J&&(!W||g$(B,J)))return;let D={source:$,sink:J,nextSource:X,prevSink:B,nextSink:null};if(J.sourcesTail=$.sinksTail=D,z)z.nextSource=D;else J.sources=D;if(B)B.nextSink=D;else $.sinks=D}function k$($){let{source:J,nextSource:z,nextSink:X,prevSink:W}=$;if(X)X.prevSink=W;else J.sinksTail=W;if(W)W.nextSink=X;else J.sinks=X;if(!J.sinks){if(J.stop)J.stop(),J.stop=void 0;if("sources"in J&&J.sources){let B=J;B.sourcesTail=null,H$(B)}}return z}function H$($){let J=$.sourcesTail,z=J?J.nextSource:$.sources;while(z)z=k$(z);if(J)J.nextSource=null;else $.sources=null}function x($,J=G){let z=$.flags;if("sinks"in $){if((z&(G|$$))>=J)return;if($.flags=z|J,"controller"in $&&$.controller)$.controller.abort(),$.controller=void 0;for(let X=$.sinks;X;X=X.nextSink)x(X.sink,$$)}else{if((z&(G|$$))>=J)return;let X=z&(G|$$);if($.flags=J,!X)C$.push($)}}function N$($,J){if($.equals($.value,J))return;$.value=J;for(let z=$.sinks;z;z=z.nextSink)x(z.sink);if(O===0)w()}function J$($,J){if(!$.cleanup)$.cleanup=J;else if(Array.isArray($.cleanup))$.cleanup.push(J);else $.cleanup=[$.cleanup,J]}function K$($){if(!$.cleanup)return;if(Array.isArray($.cleanup))for(let J=0;J<$.cleanup.length;J++)$.cleanup[J]();else $.cleanup();$.cleanup=null}function v$($){let J=V;V=$,$.sourcesTail=null,$.flags=U$;let z=!1;try{let X=$.fn($.value);if($.error||!$.equals(X,$.value))$.value=X,$.error=void 0,z=!0}catch(X){z=!0,$.error=X instanceof Error?X:Error(String(X))}finally{V=J,H$($)}if(z){for(let X=$.sinks;X;X=X.nextSink)if(X.sink.flags&$$)X.sink.flags|=G}$.flags=p}function c$($){$.controller?.abort();let J=new AbortController;$.controller=J,$.error=void 0;let z=V;V=$,$.sourcesTail=null,$.flags=U$;let X;try{X=$.fn($.value,J.signal)}catch(W){$.controller=void 0,$.error=W instanceof Error?W:Error(String(W));return}finally{V=z,H$($)}X.then((W)=>{if(J.signal.aborted)return;if($.controller=void 0,$.error||!$.equals(W,$.value)){$.value=W,$.error=void 0;for(let B=$.sinks;B;B=B.nextSink)x(B.sink);if(O===0)w()}},(W)=>{if(J.signal.aborted)return;$.controller=void 0;let B=W instanceof Error?W:Error(String(W));if(!$.error||B.name!==$.error.name||B.message!==$.error.message){$.error=B;for(let D=$.sinks;D;D=D.nextSink)x(D.sink);if(O===0)w()}}),$.flags=p}function T$($){K$($);let J=V,z=_;V=_=$,$.sourcesTail=null,$.flags=U$;try{let X=$.fn();if(typeof X==="function")J$($,X)}finally{V=J,_=z,H$($)}$.flags=p}function I($){if($.flags&$$)for(let J=$.sources;J;J=J.nextSource){if("fn"in J.source)I(J.source);if($.flags&G)break}if($.flags&U$)throw new Z$("controller"in $?d:("value"in $)?u:"Effect");if($.flags&G)if("controller"in $)c$($);else if("value"in $)v$($);else T$($);else $.flags=p}function w(){if(_$)return;_$=!0;try{for(let $=0;$<C$.length;$++){let J=C$[$];if(J.flags&(G|$$))I(J)}C$.length=0}finally{_$=!1}}function z$($){O++;try{$()}finally{if(O--,O===0)w()}}function v($){let J=V;V=null;try{return $()}finally{V=J}}function u$($){let J=_,z={cleanup:null};_=z;try{let X=$();if(typeof X==="function")J$(z,X);let W=()=>K$(z);if(J)J$(J,W);return W}finally{_=J}}function d$($){let J=_;_=null;try{return $()}finally{_=J}}function y($,J){C(c,$,J?.guard);let z={value:$,sinks:null,sinksTail:null,equals:J?.equals??k,guard:J?.guard};return{[Symbol.toStringTag]:c,get(){if(V)F(z,V);return z.value},set(X){C(c,X,z.guard),N$(z,X)},update(X){S(c,X);let W=X(z.value);C(c,W,z.guard),N$(z,W)}}}function V$($){return Y($,c)}function n($,J,z){if(Object.is($,J))return!0;if(typeof $!==typeof J)return!1;if($==null||typeof $!=="object"||J==null||typeof J!=="object")return!1;if(!z)z=new WeakSet;if(z.has($)||z.has(J))throw new Z$("isEqual");z.add($),z.add(J);try{let X=Array.isArray($);if(X!==Array.isArray(J))return!1;if(X){let W=$,B=J;if(W.length!==B.length)return!1;for(let D=0;D<W.length;D++)if(!n(W[D],B[D],z))return!1;return!0}if(E($)&&E(J)){let W=Object.keys($),B=Object.keys(J);if(W.length!==B.length)return!1;for(let D of W){if(!(D in J))return!1;if(!n($[D],J[D],z))return!1}return!0}return!1}finally{z.delete($),z.delete(J)}}function R$($,J){if($.length!==J.length)return!1;for(let z=0;z<$.length;z++)if($[z]!==J[z])return!1;return!0}function E$($){let J=0,z=typeof $==="function";return[typeof $==="string"?()=>`${$}${J++}`:z?(X)=>$(X)||String(J++):()=>String(J++),z]}function t$($,J,z,X,W){let B=new WeakSet,D={},M={},R={},P=[],Q=!1,j=new Map;for(let q=0;q<$.length;q++){let Z=z[q],H=$[q];if(Z&&H!==void 0)j.set(Z,H)}let m=new Set;for(let q=0;q<J.length;q++){let Z=J[q];if(Z===void 0)continue;let H=W?X(Z):z[q]??X(Z);if(m.has(H))throw new e(L,H,Z);if(P.push(H),m.add(H),!j.has(H))D[H]=Z,Q=!0;else if(!n(j.get(H),Z,B))M[H]=Z,Q=!0}for(let[q]of j)if(!m.has(q))R[q]=null,Q=!0;if(!Q&&!R$(z,P))Q=!0;return{add:D,change:M,remove:R,newKeys:P,changed:Q}}function Q$($,J){C(L,$,Array.isArray);let z=new Map,X=[],[W,B]=E$(J?.keyConfig),D=()=>X.map((Z)=>z.get(Z)?.get()).filter((Z)=>Z!==void 0),M={fn:D,value:$,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:n,error:void 0},R=(Z)=>{let H={};for(let U=0;U<Z.length;U++){let N=Z[U];if(N===void 0)continue;let K=X[U];if(!K)K=W(N),X[U]=K;H[K]=N}return H},P=(Z)=>{let H=!1;for(let U in Z.add){let N=Z.add[U];C(`${L} item for key "${U}"`,N),z.set(U,y(N)),H=!0}if(Object.keys(Z.change).length)z$(()=>{for(let U in Z.change){let N=Z.change[U];C(`${L} item for key "${U}"`,N);let K=z.get(U);if(K)K.set(N)}});for(let U in Z.remove){z.delete(U);let N=X.indexOf(U);if(N!==-1)X.splice(N,1);H=!0}if(H)M.flags|=b;return Z.changed},Q=J?.watched,j=Q?()=>{if(V){if(!M.sinks)M.stop=Q();F(M,V)}}:()=>{if(V)F(M,V)},m=R($);for(let Z in m){let H=m[Z];C(`${L} item for key "${Z}"`,H),z.set(Z,y(H))}M.value=$,M.flags=0;let q={[Symbol.toStringTag]:L,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of X){let H=z.get(Z);if(H)yield H}},get length(){return j(),X.length},get(){if(j(),M.sources){if(M.flags){let Z=M.flags&b;if(M.value=v(D),Z){if(M.flags=G,I(M),M.error)throw M.error}else M.flags=p}}else if(I(M),M.error)throw M.error;return M.value},set(Z){let H=M.flags&G?D():M.value,U=t$(H,Z,X,W,B);if(U.changed){X=U.newKeys,P(U),M.flags|=G;for(let N=M.sinks;N;N=N.nextSink)x(N.sink);if(O===0)w()}},update(Z){q.set(Z(q.get()))},at(Z){let H=X[Z];return H!==void 0?z.get(H):void 0},keys(){return j(),X.values()},byKey(Z){return z.get(Z)},keyAt(Z){return X[Z]},indexOfKey(Z){return X.indexOf(Z)},add(Z){let H=W(Z);if(z.has(H))throw new e(L,H,Z);if(!X.includes(H))X.push(H);C(`${L} item for key "${H}"`,Z),z.set(H,y(Z)),M.flags|=G|b;for(let U=M.sinks;U;U=U.nextSink)x(U.sink);if(O===0)w();return H},remove(Z){let H=typeof Z==="number"?X[Z]:Z;if(H===void 0)return;if(z.delete(H)){let N=typeof Z==="number"?Z:X.indexOf(H);if(N>=0)X.splice(N,1);M.flags|=G|b;for(let K=M.sinks;K;K=K.nextSink)x(K.sink);if(O===0)w()}},replace(Z,H){let U=z.get(Z);if(!U)return;if(C(`${L} item for key "${Z}"`,H),U.get()===H)return;U.set(H),M.flags|=G;for(let N=M.sinks;N;N=N.nextSink)x(N.sink);if(O===0)w()},sort(Z){let U=X.map((N)=>[N,z.get(N)?.get()]).sort(g(Z)?(N,K)=>Z(N[1],K[1]):(N,K)=>String(N[1]).localeCompare(String(K[1]))).map(([N])=>N);if(!R$(X,U)){X=U,M.flags|=G;for(let N=M.sinks;N;N=N.nextSink)x(N.sink);if(O===0)w()}},splice(Z,H,...U){let N=X.length,K=Z<0?Math.max(0,N+Z):Math.min(Z,N),f=Math.max(0,Math.min(H??Math.max(0,N-Math.max(0,K)),N-K)),A={},T={};for(let h=0;h<f;h++){let a=K+h,f$=X[a];if(f$){let y$=z.get(f$);if(y$)T[f$]=y$.get()}}let I$=X.slice(0,K);for(let h of U){let a=W(h);if(z.has(a)&&!(a in T))throw new e(L,a,h);I$.push(a),A[a]=h}I$.push(...X.slice(K+f));let h$=!!(Object.keys(A).length||Object.keys(T).length);if(h$){P({add:A,change:{},remove:T,changed:h$}),X=I$,M.flags|=G;for(let h=M.sinks;h;h=h.nextSink)x(h.sink);if(O===0)w()}return Object.values(T)},deriveCollection(Z){return x$(q,Z)}};return q}function O$($){return Y($,L)}function B$($,J){if(S(u,$,X$),J?.value!==void 0)C(u,J.value,J?.guard);let z={fn:$,value:J?.value,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:J?.equals??k,error:void 0,stop:void 0},X=J?.watched,W=X?()=>{if(V){if(!z.sinks)z.stop=X(()=>{if(x(z),O===0)w()});F(z,V)}}:()=>{if(V)F(z,V)};return{[Symbol.toStringTag]:u,get(){if(W(),I(z),z.error)throw z.error;return W$(u,z.value),z.value}}}function S$($){return Y($,u)}function q$($,J){if(S(d,$,o),J?.value!==void 0)C(d,J.value,J?.guard);let z={fn:$,value:J?.value,sources:null,sourcesTail:null,sinks:null,sinksTail:null,flags:G,equals:J?.equals??k,controller:void 0,error:void 0,stop:void 0},X=J?.watched,W=X?()=>{if(V){if(!z.sinks)z.stop=X(()=>{if(x(z),O===0)w()});F(z,V)}}:()=>{if(V)F(z,V)};return{[Symbol.toStringTag]:d,get(){if(W(),I(z),z.error)throw z.error;return W$(d,z.value),z.value},isPending(){return!!z.controller},abort(){z.controller?.abort(),z.controller=void 0}}}function p$($){return Y($,d)}function x$($,J){S(s,J);let z=o(J),X=new Map,W=[],B=(q)=>{let Z=z?q$(async(H,U)=>{let N=$.byKey(q)?.get();if(N==null)return H;return J(N,U)}):B$(()=>{let H=$.byKey(q)?.get();if(H==null)return;return J(H)});X.set(q,Z)};function D(q){if(!R$(W,q)){let Z=new Set(W),H=new Set(q);for(let U of W)if(!H.has(U))X.delete(U);for(let U of q)if(!Z.has(U))B(U);W=q,P.flags|=b}}function M(){D(Array.from($.keys()));let q=[];for(let Z of W)try{let H=X.get(Z)?.get();if(H!=null)q.push(H)}catch(H){if(!(H instanceof i))throw H}return q}let P={fn:M,value:[],flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:(q,Z)=>{if(q.length!==Z.length)return!1;for(let H=0;H<q.length;H++)if(q[H]!==Z[H])return!1;return!0},error:void 0};function Q(){if(P.sources){if(P.flags)if(P.value=v(M),P.flags&b){if(P.flags=G,I(P),P.error)throw P.error}else P.flags=p}else if(P.sinks){if(I(P),P.error)throw P.error}else P.value=v(M)}let j=Array.from(v(()=>$.keys()));for(let q of j)B(q);W=j;let m={[Symbol.toStringTag]:s,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let q of W){let Z=X.get(q);if(Z)yield Z}},get length(){if(V)F(P,V);return Q(),W.length},keys(){if(V)F(P,V);return Q(),W.values()},get(){if(V)F(P,V);return Q(),P.value},at(q){let Z=W[q];return Z!==void 0?X.get(Z):void 0},byKey(q){return X.get(q)},keyAt(q){return W[q]},indexOfKey(q){return W.indexOf(q)},deriveCollection(q){return x$(m,q)}};return m}function s$($,J){let z=J?.value??[];if(z.length)C(s,z,Array.isArray);S(s,$,X$);let X=new Map,W=[],B=new Map,[D,M]=E$(J?.keyConfig),R=(Z)=>B.get(Z)??(M?D(Z):void 0),P=J?.createItem??y;function Q(){let Z=[];for(let H of W)try{let U=X.get(H)?.get();if(U!=null)Z.push(U)}catch(U){if(!(U instanceof i))throw U}return Z}let j={fn:Q,value:z,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:L$,error:void 0};for(let Z of z){let H=D(Z);X.set(H,P(Z)),B.set(Z,H),W.push(H)}j.value=z,j.flags=G;function m(){if(V){if(!j.sinks)j.stop=$((Z)=>{let{add:H,change:U,remove:N}=Z;if(!H?.length&&!U?.length&&!N?.length)return;let K=!1;z$(()=>{if(H)for(let f of H){let A=D(f);if(X.set(A,P(f)),B.set(f,A),!W.includes(A))W.push(A);K=!0}if(U)for(let f of U){let A=R(f);if(!A)continue;let T=X.get(A);if(T&&V$(T))B.delete(T.get()),T.set(f),B.set(f,A)}if(N)for(let f of N){let A=R(f);if(!A)continue;B.delete(f),X.delete(A);let T=W.indexOf(A);if(T!==-1)W.splice(T,1);K=!0}j.flags=G|(K?b:0);for(let f=j.sinks;f;f=f.nextSink)x(f.sink)})});F(j,V)}}let q={[Symbol.toStringTag]:s,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of W){let H=X.get(Z);if(H)yield H}},get length(){return m(),W.length},keys(){return m(),W.values()},get(){if(m(),j.sources){if(j.flags){let Z=j.flags&b;if(j.value=v(Q),Z){if(j.flags=G,I(j),j.error)throw j.error}else j.flags=p}}else if(I(j),j.error)throw j.error;return j.value},at(Z){let H=W[Z];return H!==void 0?X.get(H):void 0},byKey(Z){return X.get(Z)},keyAt(Z){return W[Z]},indexOfKey(Z){return W.indexOf(Z)},deriveCollection(Z){return x$(q,Z)}};return q}function r$($){return Y($,s)}function l$($){S("Effect",$);let J={fn:$,flags:G,sources:null,sourcesTail:null,cleanup:null},z=()=>{K$(J),J.fn=void 0,J.flags=p,J.sourcesTail=null,H$(J)};if(_)J$(_,z);return T$(J),z}function o$($,J){if(!_)throw new G$("match");let z=!Array.isArray($),X=z?[$]:$,{nil:W}=J,B=z?(j)=>J.ok(j[0]):(j)=>J.ok(j),D=z&&J.err?(j)=>J.err(j[0]):J.err??console.error,M,R=!1,P=Array(X.length);for(let j=0;j<X.length;j++)try{P[j]=X[j].get()}catch(m){if(m instanceof i){R=!0;continue}if(!M)M=[];M.push(m instanceof Error?m:Error(String(m)))}let Q;try{if(R)Q=W?.();else if(M)Q=D(M);else Q=B(P)}catch(j){D([j instanceof Error?j:Error(String(j))])}if(typeof Q==="function")return Q;if(Q instanceof Promise){let j=_,m=new AbortController;J$(j,()=>m.abort()),Q.then((q)=>{if(!m.signal.aborted&&typeof q==="function")J$(j,q)}).catch((q)=>{D([q instanceof Error?q:Error(String(q))])})}}function i$($,J){if(S(t,$,X$),J?.value!==void 0)C(t,J.value,J?.guard);let z={value:J?.value,sinks:null,sinksTail:null,equals:J?.equals??k,guard:J?.guard,stop:void 0};return{[Symbol.toStringTag]:t,get(){if(V){if(!z.sinks)z.stop=$((X)=>{C(t,X,z.guard),N$(z,X)});F(z,V)}return W$(t,z.value),z.value}}}function n$($){return Y($,t)}function a$($,J){let z=E($)||Array.isArray($),X=E(J)||Array.isArray(J);if(!z||!X){let j=!Object.is($,J);return{changed:j,add:j&&X?J:{},change:{},remove:j&&z?$:{}}}let W=new WeakSet,B={},D={},M={},R=!1,P=Object.keys($),Q=Object.keys(J);for(let j of Q)if(j in $){if(!n($[j],J[j],W))D[j]=J[j],R=!0}else B[j]=J[j],R=!0;for(let j of P)if(!(j in J))M[j]=void 0,R=!0;return{add:B,change:D,remove:M,changed:R}}function m$($,J){C(r,$,E);let z=new Map,X=(Q,j)=>{if(C(`${r} for key "${Q}"`,j),Array.isArray(j))z.set(Q,Q$(j));else if(E(j))z.set(Q,m$(j));else z.set(Q,y(j))},W=()=>{let Q={};return z.forEach((j,m)=>{Q[m]=j.get()}),Q},B={fn:W,value:$,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:n,error:void 0},D=(Q)=>{let j=!1;for(let m in Q.add)X(m,Q.add[m]),j=!0;if(Object.keys(Q.change).length)z$(()=>{for(let m in Q.change){let q=Q.change[m];C(`${r} for key "${m}"`,q);let Z=z.get(m);if(Z)if(E(q)!==F$(Z))X(m,q),j=!0;else Z.set(q)}});for(let m in Q.remove)z.delete(m),j=!0;if(j)B.flags|=b;return Q.changed},M=J?.watched,R=M?()=>{if(V){if(!B.sinks)B.stop=M();F(B,V)}}:()=>{if(V)F(B,V)};for(let Q of Object.keys($))X(Q,$[Q]);let P={[Symbol.toStringTag]:r,[Symbol.isConcatSpreadable]:!1,*[Symbol.iterator](){for(let Q of Array.from(z.keys())){let j=z.get(Q);if(j)yield[Q,j]}},keys(){return R(),z.keys()},byKey(Q){return z.get(Q)},get(){if(R(),B.sources){if(B.flags){let Q=B.flags&b;if(B.value=v(W),Q){if(B.flags=G,I(B),B.error)throw B.error}else B.flags=p}}else if(I(B),B.error)throw B.error;return B.value},set(Q){let j=B.flags&G?W():B.value,m=a$(j,Q);if(D(m)){B.flags|=G;for(let q=B.sinks;q;q=q.nextSink)x(q.sink);if(O===0)w()}},update(Q){P.set(Q(P.get()))},add(Q,j){if(z.has(Q))throw new e(r,Q,j);X(Q,j),B.flags|=G|b;for(let m=B.sinks;m;m=m.nextSink)x(m.sink);if(O===0)w();return Q},remove(Q){if(z.delete(Q)){B.flags|=G|b;for(let m=B.sinks;m;m=m.nextSink)x(m.sink);if(O===0)w()}}};return new Proxy(P,{get(Q,j){if(j in Q)return Reflect.get(Q,j);if(typeof j!=="symbol")return Q.byKey(j)},has(Q,j){if(j in Q)return!0;return Q.byKey(String(j))!==void 0},ownKeys(Q){return Array.from(Q.keys())},getOwnPropertyDescriptor(Q,j){if(j in Q)return Reflect.getOwnPropertyDescriptor(Q,j);if(typeof j==="symbol")return;let m=Q.byKey(String(j));return m?{enumerable:!0,configurable:!0,writable:!0,value:m}:void 0}})}function F$($){return Y($,r)}function e$($,J){return o($)?q$($,J):B$($,J)}function $J($){if(M$($))return $;if($==null)throw new j$("createSignal",$);if(o($))return q$($);if(g($))return B$($);if(Y$($))return Q$($);if(E($))return m$($);return y($)}function JJ($){if(w$($))return $;if($==null||g($)||M$($))throw new j$("createMutableSignal",$);if(Y$($))return Q$($);if(E($))return m$($);return y($)}function zJ($){return S$($)||p$($)}function M$($){let J=[c,u,d,t,l,L,s,r],z=Object.prototype.toString.call($).slice(8,-1);return J.includes(z)}function w$($){return V$($)||F$($)||O$($)}function XJ($,J){C(l,$,M$);let z=$,X=J?.guard,W={fn:()=>z.get(),value:void 0,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:J?.equals??k,error:void 0},B=()=>{if(V)F(W,V);if(I(W),W.error)throw W.error;return W.value},D=(R)=>{if(!w$(z))throw new P$(l);C(l,R,X),z.set(R)},M=(R)=>{C(l,R,M$),z=R,W.flags|=G;for(let P=W.sinks;P;P=P.nextSink)x(P.sink);if(O===0)w()};return{[Symbol.toStringTag]:l,configurable:!0,enumerable:!0,get:B,set:D,replace:M,current:()=>z}}function ZJ($){return Y($,l)}export{D$ as valueString,v as untrack,d$ as unown,o$ as match,p$ as isTask,F$ as isStore,V$ as isState,ZJ as isSlot,M$ as isSignal,n$ as isSensor,E as isRecord,Y as isObjectOfType,w$ as isMutableSignal,S$ as isMemo,O$ as isList,g as isFunction,n as isEqual,zJ as isComputed,r$ as isCollection,o as isAsyncFunction,q$ as createTask,m$ as createStore,y as createState,XJ as createSlot,$J as createSignal,i$ as createSensor,u$ as createScope,JJ as createMutableSignal,B$ as createMemo,Q$ as createList,l$ as createEffect,e$ as createComputed,s$ as createCollection,z$ as batch,i as UnsetSignalValueError,L$ as SKIP_EQUALITY,G$ as RequiredOwnerError,P$ as ReadonlySignalError,A$ as NullishSignalValueError,j$ as InvalidSignalValueError,b$ as InvalidCallbackError,Z$ as CircularDependencyError};
|
|
1
|
+
function g($){return typeof $==="function"}function l($){return g($)&&$.constructor.name==="AsyncFunction"}function X$($){return g($)&&$.constructor.name!=="AsyncFunction"}function Y($,J){return Object.prototype.toString.call($)===`[object ${J}]`}function E($){return Y($,"Object")}function Y$($,J=(z)=>z!=null){return Array.isArray($)&&$.every(J)}function D$($){return typeof $==="string"?`"${$}"`:!!$&&typeof $==="object"?JSON.stringify($):String($)}class Z$ extends Error{constructor($){super(`[${$}] Circular dependency detected`);this.name="CircularDependencyError"}}class A$ extends TypeError{constructor($){super(`[${$}] Signal value cannot be null or undefined`);this.name="NullishSignalValueError"}}class i extends Error{constructor($){super(`[${$}] Signal value is unset`);this.name="UnsetSignalValueError"}}class j$ extends TypeError{constructor($,J){super(`[${$}] Signal value ${D$(J)} is invalid`);this.name="InvalidSignalValueError"}}class b$ extends TypeError{constructor($,J){super(`[${$}] Callback ${D$(J)} is invalid`);this.name="InvalidCallbackError"}}class P$ extends Error{constructor($){super(`[${$}] Signal is read-only`);this.name="ReadonlySignalError"}}class G$ extends Error{constructor($){super(`[${$}] Active owner is required`);this.name="RequiredOwnerError"}}class e extends Error{constructor($,J,z){super(`[${$}] Could not add key "${J}"${z?` with value ${JSON.stringify(z)}`:""} because it already exists`);this.name="DuplicateKeyError"}}function C($,J,z){if(J==null)throw new A$($);if(z&&!z(J))throw new j$($,J)}function W$($,J){if(J==null)throw new i($)}function S($,J,z=g){if(!z(J))throw new b$($,J)}var c="State",u="Memo",d="Task",t="Sensor",L="List",s="Collection",r="Store",o="Slot",p=0,$$=1,G=2,U$=4,b=8,V=null,_=null,C$=[],O=0,_$=!1,k=($,J)=>$===J,L$=($,J)=>!1;function k$($,J){let z=J.sourcesTail;if(z){let X=J.sources;while(X){if(X===$)return!0;if(X===z)break;X=X.nextSource}}return!1}function x($,J){let z=J.sourcesTail;if(z?.source===$)return;let X=null,W=J.flags&U$;if(W){if(X=z?z.nextSource:J.sources,X?.source===$){J.sourcesTail=X;return}}let B=$.sinksTail;if(B?.sink===J&&(!W||k$(B,J)))return;let D={source:$,sink:J,nextSource:X,prevSink:B,nextSink:null};if(J.sourcesTail=$.sinksTail=D,z)z.nextSource=D;else J.sources=D;if(B)B.nextSink=D;else $.sinks=D}function v$($){let{source:J,nextSource:z,nextSink:X,prevSink:W}=$;if(X)X.prevSink=W;else J.sinksTail=W;if(W)W.nextSink=X;else J.sinks=X;if(!J.sinks){if(J.stop)J.stop(),J.stop=void 0;if("sources"in J&&J.sources){let B=J;B.sourcesTail=null,H$(B)}}return z}function H$($){let J=$.sourcesTail,z=J?J.nextSource:$.sources;while(z)z=v$(z);if(J)J.nextSource=null;else $.sources=null}function F($,J=G){let z=$.flags;if("sinks"in $){if((z&(G|$$))>=J)return;if($.flags=z|J,"controller"in $&&$.controller)$.controller.abort(),$.controller=void 0;for(let X=$.sinks;X;X=X.nextSink)F(X.sink,$$)}else{if((z&(G|$$))>=J)return;let X=z&(G|$$);if($.flags=J,!X)C$.push($)}}function N$($,J){if($.equals($.value,J))return;$.value=J;for(let z=$.sinks;z;z=z.nextSink)F(z.sink);if(O===0)w()}function J$($,J){if(!$.cleanup)$.cleanup=J;else if(Array.isArray($.cleanup))$.cleanup.push(J);else $.cleanup=[$.cleanup,J]}function K$($){if(!$.cleanup)return;if(Array.isArray($.cleanup))for(let J=0;J<$.cleanup.length;J++)$.cleanup[J]();else $.cleanup();$.cleanup=null}function c$($){let J=V;V=$,$.sourcesTail=null,$.flags=U$;let z=!1;try{let X=$.fn($.value);if($.error||!$.equals(X,$.value))$.value=X,$.error=void 0,z=!0}catch(X){z=!0,$.error=X instanceof Error?X:Error(String(X))}finally{V=J,H$($)}if(z){for(let X=$.sinks;X;X=X.nextSink)if(X.sink.flags&$$)X.sink.flags|=G}$.flags=p}function u$($){$.controller?.abort();let J=new AbortController;$.controller=J,$.error=void 0;let z=V;V=$,$.sourcesTail=null,$.flags=U$;let X;try{X=$.fn($.value,J.signal)}catch(W){$.controller=void 0,$.error=W instanceof Error?W:Error(String(W));return}finally{V=z,H$($)}X.then((W)=>{if(J.signal.aborted)return;if($.controller=void 0,$.error||!$.equals(W,$.value)){$.value=W,$.error=void 0;for(let B=$.sinks;B;B=B.nextSink)F(B.sink);if(O===0)w()}},(W)=>{if(J.signal.aborted)return;$.controller=void 0;let B=W instanceof Error?W:Error(String(W));if(!$.error||B.name!==$.error.name||B.message!==$.error.message){$.error=B;for(let D=$.sinks;D;D=D.nextSink)F(D.sink);if(O===0)w()}}),$.flags=p}function T$($){K$($);let J=V,z=_;V=_=$,$.sourcesTail=null,$.flags=U$;try{let X=$.fn();if(typeof X==="function")J$($,X)}finally{V=J,_=z,H$($)}$.flags=p}function I($){if($.flags&$$)for(let J=$.sources;J;J=J.nextSource){if("fn"in J.source)I(J.source);if($.flags&G)break}if($.flags&U$)throw new Z$("controller"in $?d:("value"in $)?u:"Effect");if($.flags&G)if("controller"in $)u$($);else if("value"in $)c$($);else T$($);else $.flags=p}function w(){if(_$)return;_$=!0;try{for(let $=0;$<C$.length;$++){let J=C$[$];if(J.flags&(G|$$))I(J)}C$.length=0}finally{_$=!1}}function z$($){O++;try{$()}finally{if(O--,O===0)w()}}function v($){let J=V;V=null;try{return $()}finally{V=J}}function d$($){let J=_,z={cleanup:null};_=z;try{let X=$();if(typeof X==="function")J$(z,X);let W=()=>K$(z);if(J)J$(J,W);return W}finally{_=J}}function t$($){let J=_;_=null;try{return $()}finally{_=J}}function y($,J){C(c,$,J?.guard);let z={value:$,sinks:null,sinksTail:null,equals:J?.equals??k,guard:J?.guard};return{[Symbol.toStringTag]:c,get(){if(V)x(z,V);return z.value},set(X){C(c,X,z.guard),N$(z,X)},update(X){S(c,X);let W=X(z.value);C(c,W,z.guard),N$(z,W)}}}function V$($){return Y($,c)}function n($,J,z){if(Object.is($,J))return!0;if(typeof $!==typeof J)return!1;if($==null||typeof $!=="object"||J==null||typeof J!=="object")return!1;if(!z)z=new WeakSet;if(z.has($)||z.has(J))throw new Z$("isEqual");z.add($),z.add(J);try{let X=Array.isArray($);if(X!==Array.isArray(J))return!1;if(X){let W=$,B=J;if(W.length!==B.length)return!1;for(let D=0;D<W.length;D++)if(!n(W[D],B[D],z))return!1;return!0}if(E($)&&E(J)){let W=Object.keys($),B=Object.keys(J);if(W.length!==B.length)return!1;for(let D of W){if(!(D in J))return!1;if(!n($[D],J[D],z))return!1}return!0}return!1}finally{z.delete($),z.delete(J)}}function R$($,J){if($.length!==J.length)return!1;for(let z=0;z<$.length;z++)if($[z]!==J[z])return!1;return!0}function E$($){let J=0,z=typeof $==="function";return[typeof $==="string"?()=>`${$}${J++}`:z?(X)=>$(X)||String(J++):()=>String(J++),z]}function s$($,J,z,X,W){let B=new WeakSet,D={},M={},K={},P=[],Q=!1,j=new Map;for(let q=0;q<$.length;q++){let Z=z[q],H=$[q];if(Z&&H!==void 0)j.set(Z,H)}let m=new Set;for(let q=0;q<J.length;q++){let Z=J[q];if(Z===void 0)continue;let H=W?X(Z):z[q]??X(Z);if(m.has(H))throw new e(L,H,Z);if(P.push(H),m.add(H),!j.has(H))D[H]=Z,Q=!0;else if(!n(j.get(H),Z,B))M[H]=Z,Q=!0}for(let[q]of j)if(!m.has(q))K[q]=null,Q=!0;if(!Q&&!R$(z,P))Q=!0;return{add:D,change:M,remove:K,newKeys:P,changed:Q}}function Q$($,J){C(L,$,Array.isArray);let z=new Map,X=[],[W,B]=E$(J?.keyConfig),D=()=>X.map((Z)=>z.get(Z)?.get()).filter((Z)=>Z!==void 0),M={fn:D,value:$,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:n,error:void 0},K=(Z)=>{let H={};for(let U=0;U<Z.length;U++){let N=Z[U];if(N===void 0)continue;let R=X[U];if(!R)R=W(N),X[U]=R;H[R]=N}return H},P=(Z)=>{let H=!1;for(let U in Z.add){let N=Z.add[U];C(`${L} item for key "${U}"`,N),z.set(U,y(N)),H=!0}if(Object.keys(Z.change).length)z$(()=>{for(let U in Z.change){let N=Z.change[U];C(`${L} item for key "${U}"`,N);let R=z.get(U);if(R)R.set(N)}});for(let U in Z.remove){z.delete(U);let N=X.indexOf(U);if(N!==-1)X.splice(N,1);H=!0}if(H)M.flags|=b;return Z.changed},Q=J?.watched,j=Q?()=>{if(V){if(!M.sinks)M.stop=Q();x(M,V)}}:()=>{if(V)x(M,V)},m=K($);for(let Z in m){let H=m[Z];C(`${L} item for key "${Z}"`,H),z.set(Z,y(H))}M.value=$,M.flags=0;let q={[Symbol.toStringTag]:L,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of X){let H=z.get(Z);if(H)yield H}},get length(){return j(),X.length},get(){if(j(),M.sources){if(M.flags){let Z=M.flags&b;if(M.value=v(D),Z){if(M.flags=G,I(M),M.error)throw M.error}else M.flags=p}}else if(I(M),M.error)throw M.error;return M.value},set(Z){let H=M.flags&G?D():M.value,U=s$(H,Z,X,W,B);if(U.changed){X=U.newKeys,P(U),M.flags|=G;for(let N=M.sinks;N;N=N.nextSink)F(N.sink);if(O===0)w()}},update(Z){q.set(Z(q.get()))},at(Z){let H=X[Z];return H!==void 0?z.get(H):void 0},keys(){return j(),X.values()},byKey(Z){return z.get(Z)},keyAt(Z){return X[Z]},indexOfKey(Z){return X.indexOf(Z)},add(Z){let H=W(Z);if(z.has(H))throw new e(L,H,Z);if(!X.includes(H))X.push(H);C(`${L} item for key "${H}"`,Z),z.set(H,y(Z)),M.flags|=G|b;for(let U=M.sinks;U;U=U.nextSink)F(U.sink);if(O===0)w();return H},remove(Z){let H=typeof Z==="number"?X[Z]:Z;if(H===void 0)return;if(z.delete(H)){let N=typeof Z==="number"?Z:X.indexOf(H);if(N>=0)X.splice(N,1);M.flags|=G|b;for(let R=M.sinks;R;R=R.nextSink)F(R.sink);if(O===0)w()}},replace(Z,H){let U=z.get(Z);if(!U)return;if(C(`${L} item for key "${Z}"`,H),U.get()===H)return;U.set(H),M.flags|=G;for(let N=M.sinks;N;N=N.nextSink)F(N.sink);if(O===0)w()},sort(Z){let U=X.map((N)=>[N,z.get(N)?.get()]).sort(g(Z)?(N,R)=>Z(N[1],R[1]):(N,R)=>String(N[1]).localeCompare(String(R[1]))).map(([N])=>N);if(!R$(X,U)){X=U,M.flags|=G;for(let N=M.sinks;N;N=N.nextSink)F(N.sink);if(O===0)w()}},splice(Z,H,...U){let N=X.length,R=Z<0?Math.max(0,N+Z):Math.min(Z,N),f=Math.max(0,Math.min(H??Math.max(0,N-Math.max(0,R)),N-R)),A={},T={};for(let h=0;h<f;h++){let a=R+h,f$=X[a];if(f$){let y$=z.get(f$);if(y$)T[f$]=y$.get()}}let I$=X.slice(0,R);for(let h of U){let a=W(h);if(z.has(a)&&!(a in T))throw new e(L,a,h);I$.push(a),A[a]=h}I$.push(...X.slice(R+f));let h$=!!(Object.keys(A).length||Object.keys(T).length);if(h$){P({add:A,change:{},remove:T,changed:h$}),X=I$,M.flags|=G;for(let h=M.sinks;h;h=h.nextSink)F(h.sink);if(O===0)w()}return Object.values(T)},deriveCollection(Z){return F$(q,Z)}};return q}function O$($){return Y($,L)}function B$($,J){if(S(u,$,X$),J?.value!==void 0)C(u,J.value,J?.guard);let z={fn:$,value:J?.value,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:J?.equals??k,error:void 0,stop:void 0},X=J?.watched,W=X?()=>{if(V){if(!z.sinks)z.stop=X(()=>{if(F(z),O===0)w()});x(z,V)}}:()=>{if(V)x(z,V)};return{[Symbol.toStringTag]:u,get(){if(W(),I(z),z.error)throw z.error;return W$(u,z.value),z.value}}}function S$($){return Y($,u)}function q$($,J){if(S(d,$,l),J?.value!==void 0)C(d,J.value,J?.guard);let z={fn:$,value:J?.value,sources:null,sourcesTail:null,sinks:null,sinksTail:null,flags:G,equals:J?.equals??k,controller:void 0,error:void 0,stop:void 0},X=J?.watched,W=X?()=>{if(V){if(!z.sinks)z.stop=X(()=>{if(F(z),O===0)w()});x(z,V)}}:()=>{if(V)x(z,V)};return{[Symbol.toStringTag]:d,get(){if(W(),I(z),z.error)throw z.error;return W$(d,z.value),z.value},isPending(){return!!z.controller},abort(){z.controller?.abort(),z.controller=void 0}}}function p$($){return Y($,d)}function F$($,J){S(s,J);let z=l(J),X=new Map,W=[],B=(q)=>{let Z=z?q$(async(H,U)=>{let N=$.byKey(q)?.get();if(N==null)return H;return J(N,U)}):B$(()=>{let H=$.byKey(q)?.get();if(H==null)return;return J(H)});X.set(q,Z)};function D(q){if(!R$(W,q)){let Z=new Set(W),H=new Set(q);for(let U of W)if(!H.has(U))X.delete(U);for(let U of q)if(!Z.has(U))B(U);W=q,P.flags|=b}}function M(){D(Array.from($.keys()));let q=[];for(let Z of W)try{let H=X.get(Z)?.get();if(H!=null)q.push(H)}catch(H){if(!(H instanceof i))throw H}return q}let P={fn:M,value:[],flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:(q,Z)=>{if(q.length!==Z.length)return!1;for(let H=0;H<q.length;H++)if(q[H]!==Z[H])return!1;return!0},error:void 0};function Q(){if(P.sources){if(P.flags)if(P.value=v(M),P.flags&b){if(P.flags=G,I(P),P.error)throw P.error}else P.flags=p}else if(P.sinks){if(I(P),P.error)throw P.error}else P.value=v(M)}let j=Array.from(v(()=>$.keys()));for(let q of j)B(q);W=j;let m={[Symbol.toStringTag]:s,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let q of W){let Z=X.get(q);if(Z)yield Z}},get length(){if(V)x(P,V);return Q(),W.length},keys(){if(V)x(P,V);return Q(),W.values()},get(){if(V)x(P,V);return Q(),P.value},at(q){let Z=W[q];return Z!==void 0?X.get(Z):void 0},byKey(q){return X.get(q)},keyAt(q){return W[q]},indexOfKey(q){return W.indexOf(q)},deriveCollection(q){return F$(m,q)}};return m}function r$($,J){let z=J?.value??[];if(z.length)C(s,z,Array.isArray);S(s,$,X$);let X=new Map,W=[],B=new Map,[D,M]=E$(J?.keyConfig),K=(Z)=>B.get(Z)??(M?D(Z):void 0),P=J?.createItem??y;function Q(){let Z=[];for(let H of W)try{let U=X.get(H)?.get();if(U!=null)Z.push(U)}catch(U){if(!(U instanceof i))throw U}return Z}let j={fn:Q,value:z,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:L$,error:void 0};for(let Z of z){let H=D(Z);X.set(H,P(Z)),B.set(Z,H),W.push(H)}j.value=z,j.flags=G;function m(){if(V){if(!j.sinks)j.stop=$((Z)=>{let{add:H,change:U,remove:N}=Z;if(!H?.length&&!U?.length&&!N?.length)return;let R=!1;z$(()=>{if(H)for(let f of H){let A=D(f);if(X.set(A,P(f)),B.set(f,A),!W.includes(A))W.push(A);R=!0}if(U)for(let f of U){let A=K(f);if(!A)continue;let T=X.get(A);if(T&&V$(T))B.delete(T.get()),T.set(f),B.set(f,A)}if(N)for(let f of N){let A=K(f);if(!A)continue;B.delete(f),X.delete(A);let T=W.indexOf(A);if(T!==-1)W.splice(T,1);R=!0}j.flags=G|(R?b:0);for(let f=j.sinks;f;f=f.nextSink)F(f.sink)})});x(j,V)}}let q={[Symbol.toStringTag]:s,[Symbol.isConcatSpreadable]:!0,*[Symbol.iterator](){for(let Z of W){let H=X.get(Z);if(H)yield H}},get length(){return m(),W.length},keys(){return m(),W.values()},get(){if(m(),j.sources){if(j.flags){let Z=j.flags&b;if(j.value=v(Q),Z){if(j.flags=G,I(j),j.error)throw j.error}else j.flags=p}}else if(I(j),j.error)throw j.error;return j.value},at(Z){let H=W[Z];return H!==void 0?X.get(H):void 0},byKey(Z){return X.get(Z)},keyAt(Z){return W[Z]},indexOfKey(Z){return W.indexOf(Z)},deriveCollection(Z){return F$(q,Z)}};return q}function o$($){return Y($,s)}function l$($){S("Effect",$);let J={fn:$,flags:G,sources:null,sourcesTail:null,cleanup:null},z=()=>{K$(J),J.fn=void 0,J.flags=p,J.sourcesTail=null,H$(J)};if(_)J$(_,z);return T$(J),z}function i$($,J){if(!_)throw new G$("match");let z=!Array.isArray($),X=z?[$]:$,{nil:W}=J,B=z?(j)=>J.ok(j[0]):(j)=>J.ok(j),D=z&&J.err?(j)=>J.err(j[0]):J.err??console.error,M,K=!1,P=Array(X.length);for(let j=0;j<X.length;j++)try{P[j]=X[j].get()}catch(m){if(m instanceof i){K=!0;continue}if(!M)M=[];M.push(m instanceof Error?m:Error(String(m)))}let Q;try{if(K)Q=W?.();else if(M)Q=D(M);else Q=B(P)}catch(j){D([j instanceof Error?j:Error(String(j))])}if(typeof Q==="function")return Q;if(Q instanceof Promise){let j=_,m=new AbortController;J$(j,()=>m.abort()),Q.then((q)=>{if(!m.signal.aborted&&typeof q==="function")J$(j,q)}).catch((q)=>{D([q instanceof Error?q:Error(String(q))])})}}function n$($,J){if(S(t,$,X$),J?.value!==void 0)C(t,J.value,J?.guard);let z={value:J?.value,sinks:null,sinksTail:null,equals:J?.equals??k,guard:J?.guard,stop:void 0};return{[Symbol.toStringTag]:t,get(){if(V){if(!z.sinks)z.stop=$((X)=>{C(t,X,z.guard),N$(z,X)});x(z,V)}return W$(t,z.value),z.value}}}function a$($){return Y($,t)}function e$($,J){let z=E($)||Array.isArray($),X=E(J)||Array.isArray(J);if(!z||!X){let j=!Object.is($,J);return{changed:j,add:j&&X?J:{},change:{},remove:j&&z?$:{}}}let W=new WeakSet,B={},D={},M={},K=!1,P=Object.keys($),Q=Object.keys(J);for(let j of Q)if(j in $){if(!n($[j],J[j],W))D[j]=J[j],K=!0}else B[j]=J[j],K=!0;for(let j of P)if(!(j in J))M[j]=void 0,K=!0;return{add:B,change:D,remove:M,changed:K}}function m$($,J){C(r,$,E);let z=new Map,X=(Q,j)=>{if(C(`${r} for key "${Q}"`,j),Array.isArray(j))z.set(Q,Q$(j));else if(E(j))z.set(Q,m$(j));else z.set(Q,y(j))},W=()=>{let Q={};return z.forEach((j,m)=>{Q[m]=j.get()}),Q},B={fn:W,value:$,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:n,error:void 0},D=(Q)=>{let j=!1;for(let m in Q.add)X(m,Q.add[m]),j=!0;if(Object.keys(Q.change).length)z$(()=>{for(let m in Q.change){let q=Q.change[m];C(`${r} for key "${m}"`,q);let Z=z.get(m);if(Z)if(E(q)!==x$(Z))X(m,q),j=!0;else Z.set(q)}});for(let m in Q.remove)z.delete(m),j=!0;if(j)B.flags|=b;return Q.changed},M=J?.watched,K=M?()=>{if(V){if(!B.sinks)B.stop=M();x(B,V)}}:()=>{if(V)x(B,V)};for(let Q of Object.keys($))X(Q,$[Q]);let P={[Symbol.toStringTag]:r,[Symbol.isConcatSpreadable]:!1,*[Symbol.iterator](){for(let Q of Array.from(z.keys())){let j=z.get(Q);if(j)yield[Q,j]}},keys(){return K(),z.keys()},byKey(Q){return z.get(Q)},get(){if(K(),B.sources){if(B.flags){let Q=B.flags&b;if(B.value=v(W),Q){if(B.flags=G,I(B),B.error)throw B.error}else B.flags=p}}else if(I(B),B.error)throw B.error;return B.value},set(Q){let j=B.flags&G?W():B.value,m=e$(j,Q);if(D(m)){B.flags|=G;for(let q=B.sinks;q;q=q.nextSink)F(q.sink);if(O===0)w()}},update(Q){P.set(Q(P.get()))},add(Q,j){if(z.has(Q))throw new e(r,Q,j);X(Q,j),B.flags|=G|b;for(let m=B.sinks;m;m=m.nextSink)F(m.sink);if(O===0)w();return Q},remove(Q){if(z.delete(Q)){B.flags|=G|b;for(let m=B.sinks;m;m=m.nextSink)F(m.sink);if(O===0)w()}}};return new Proxy(P,{get(Q,j){if(j in Q)return Reflect.get(Q,j);if(typeof j!=="symbol")return Q.byKey(j)},has(Q,j){if(j in Q)return!0;return Q.byKey(String(j))!==void 0},ownKeys(Q){return Array.from(Q.keys())},getOwnPropertyDescriptor(Q,j){if(j in Q)return Reflect.getOwnPropertyDescriptor(Q,j);if(typeof j==="symbol")return;let m=Q.byKey(String(j));return m?{enumerable:!0,configurable:!0,writable:!0,value:m}:void 0}})}function x$($){return Y($,r)}function $J($,J){return l($)?q$($,J):B$($,J)}function JJ($){if(M$($))return $;if($==null)throw new j$("createSignal",$);if(l($))return q$($);if(g($))return B$($);if(Y$($))return Q$($);if(E($))return m$($);return y($)}function zJ($){if(w$($))return $;if($==null||g($)||M$($))throw new j$("createMutableSignal",$);if(Y$($))return Q$($);if(E($))return m$($);return y($)}function XJ($){return S$($)||p$($)}function M$($){let J=[c,u,d,t,o,L,s,r],z=Object.prototype.toString.call($).slice(8,-1);return J.includes(z)}function w$($){return V$($)||x$($)||O$($)}function ZJ($,J){C(o,$,M$);let z=$,X=J?.guard,W={fn:()=>z.get(),value:void 0,flags:G,sources:null,sourcesTail:null,sinks:null,sinksTail:null,equals:J?.equals??k,error:void 0},B=()=>{if(V)x(W,V);if(I(W),W.error)throw W.error;return W.value},D=(K)=>{if(g$(z))return z.set(K);if(!w$(z))throw new P$(o);C(o,K,X),z.set(K)},M=(K)=>{C(o,K,M$),z=K,W.flags|=G;for(let P=W.sinks;P;P=P.nextSink)F(P.sink);if(O===0)w()};return{[Symbol.toStringTag]:o,configurable:!0,enumerable:!0,get:B,set:D,replace:M,current:()=>z}}function g$($){return Y($,o)}export{D$ as valueString,v as untrack,t$ as unown,i$ as match,p$ as isTask,x$ as isStore,V$ as isState,g$ as isSlot,M$ as isSignal,a$ as isSensor,E as isRecord,Y as isObjectOfType,w$ as isMutableSignal,S$ as isMemo,O$ as isList,g as isFunction,n as isEqual,XJ as isComputed,o$ as isCollection,l as isAsyncFunction,q$ as createTask,m$ as createStore,y as createState,ZJ as createSlot,JJ as createSignal,n$ as createSensor,d$ as createScope,zJ as createMutableSignal,B$ as createMemo,Q$ as createList,l$ as createEffect,$J as createComputed,r$ as createCollection,z$ as batch,i as UnsetSignalValueError,L$ as SKIP_EQUALITY,G$ as RequiredOwnerError,P$ as ReadonlySignalError,A$ as NullishSignalValueError,j$ as InvalidSignalValueError,b$ as InvalidCallbackError,Z$ as CircularDependencyError};
|
package/index.ts
CHANGED
package/package.json
CHANGED
package/src/nodes/slot.ts
CHANGED
|
@@ -28,6 +28,9 @@ import { isObjectOfType } from '../util'
|
|
|
28
28
|
* `get`, `set`, `configurable`, and `enumerable` are used by the property definition;
|
|
29
29
|
* `replace()` and `current()` are kept on the slot object for integration-layer control.
|
|
30
30
|
*
|
|
31
|
+
* Slots are not `MutableSignal`s: they are forwarding layers, not value owners.
|
|
32
|
+
* `set()` delegates to the backing signal; `update()` is intentionally absent.
|
|
33
|
+
*
|
|
31
34
|
* @template T - The type of value held by the delegated signal.
|
|
32
35
|
*/
|
|
33
36
|
type Slot<T extends {}> = {
|
|
@@ -51,10 +54,11 @@ type Slot<T extends {}> = {
|
|
|
51
54
|
/**
|
|
52
55
|
* Creates a slot signal that delegates its value to a swappable backing signal.
|
|
53
56
|
*
|
|
54
|
-
* A slot acts as a stable reactive source
|
|
55
|
-
*
|
|
57
|
+
* A slot acts as a stable reactive source usable as a property descriptor via
|
|
58
|
+
* `Object.defineProperty(target, key, slot)`. Subscribers link to the slot itself,
|
|
56
59
|
* so replacing the backing signal with `replace()` invalidates them without breaking
|
|
57
|
-
* existing edges.
|
|
60
|
+
* existing edges. `set()` forwards to the current backing signal if it is writable;
|
|
61
|
+
* `update()` is absent — a slot is a forwarding layer, not a value owner.
|
|
58
62
|
*
|
|
59
63
|
* @since 0.18.3
|
|
60
64
|
* @template T - The type of value held by the delegated signal.
|
|
@@ -93,10 +97,10 @@ function createSlot<T extends {}>(
|
|
|
93
97
|
}
|
|
94
98
|
|
|
95
99
|
const set = (next: T): void => {
|
|
100
|
+
if (isSlot(delegated)) return delegated.set(next)
|
|
96
101
|
if (!isMutableSignal(delegated))
|
|
97
102
|
throw new ReadonlySignalError(TYPE_SLOT)
|
|
98
103
|
validateSignalValue(TYPE_SLOT, next, guard)
|
|
99
|
-
|
|
100
104
|
delegated.set(next)
|
|
101
105
|
}
|
|
102
106
|
|
package/test/slot.test.ts
CHANGED
|
@@ -103,6 +103,25 @@ describe('Slot', () => {
|
|
|
103
103
|
expect(runs).toBe(2)
|
|
104
104
|
})
|
|
105
105
|
|
|
106
|
+
test('should forward set through a Slot-to-Slot chain', () => {
|
|
107
|
+
const source = createState(1)
|
|
108
|
+
const inner = createSlot(source)
|
|
109
|
+
const outer = createSlot(inner)
|
|
110
|
+
|
|
111
|
+
outer.set(42)
|
|
112
|
+
expect(source.get()).toBe(42)
|
|
113
|
+
expect(outer.get()).toBe(42)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
test('should throw ReadonlySignalError when chain terminates in a read-only signal', () => {
|
|
117
|
+
const source = createState(2)
|
|
118
|
+
const readonly = createMemo(() => source.get() * 2)
|
|
119
|
+
const inner = createSlot(readonly)
|
|
120
|
+
const outer = createSlot(inner)
|
|
121
|
+
|
|
122
|
+
expect(() => outer.set(99)).toThrow('[Slot] Signal is read-only')
|
|
123
|
+
})
|
|
124
|
+
|
|
106
125
|
test('should validate initial signal and replacement signal', () => {
|
|
107
126
|
expect(() => {
|
|
108
127
|
// @ts-expect-error: deliberate error test
|
package/types/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @name Cause & Effect
|
|
3
|
-
* @version 1.1.
|
|
3
|
+
* @version 1.1.1
|
|
4
4
|
* @author Esther Brunner
|
|
5
5
|
*/
|
|
6
6
|
export { CircularDependencyError, type Guard, InvalidCallbackError, InvalidSignalValueError, NullishSignalValueError, ReadonlySignalError, RequiredOwnerError, UnsetSignalValueError, } from './src/errors';
|
|
@@ -8,6 +8,9 @@ import { type Signal, type SignalOptions } from '../graph';
|
|
|
8
8
|
* `get`, `set`, `configurable`, and `enumerable` are used by the property definition;
|
|
9
9
|
* `replace()` and `current()` are kept on the slot object for integration-layer control.
|
|
10
10
|
*
|
|
11
|
+
* Slots are not `MutableSignal`s: they are forwarding layers, not value owners.
|
|
12
|
+
* `set()` delegates to the backing signal; `update()` is intentionally absent.
|
|
13
|
+
*
|
|
11
14
|
* @template T - The type of value held by the delegated signal.
|
|
12
15
|
*/
|
|
13
16
|
type Slot<T extends {}> = {
|
|
@@ -28,10 +31,11 @@ type Slot<T extends {}> = {
|
|
|
28
31
|
/**
|
|
29
32
|
* Creates a slot signal that delegates its value to a swappable backing signal.
|
|
30
33
|
*
|
|
31
|
-
* A slot acts as a stable reactive source
|
|
32
|
-
*
|
|
34
|
+
* A slot acts as a stable reactive source usable as a property descriptor via
|
|
35
|
+
* `Object.defineProperty(target, key, slot)`. Subscribers link to the slot itself,
|
|
33
36
|
* so replacing the backing signal with `replace()` invalidates them without breaking
|
|
34
|
-
* existing edges.
|
|
37
|
+
* existing edges. `set()` forwards to the current backing signal if it is writable;
|
|
38
|
+
* `update()` is absent — a slot is a forwarding layer, not a value owner.
|
|
35
39
|
*
|
|
36
40
|
* @since 0.18.3
|
|
37
41
|
* @template T - The type of value held by the delegated signal.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|