easy-signal 3.2.1 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/reactiveSignal.d.ts +2 -2
- package/dist/reactiveSignal.js +12 -10
- package/dist/reactiveSignal.js.map +1 -1
- package/package.json +1 -1
- package/src/reactiveSignal.ts +16 -12
package/dist/reactiveSignal.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export interface ReactiveSignal<T> extends ComputedSignal<T> {
|
|
|
28
28
|
*/
|
|
29
29
|
export interface ComputedSignal<T> {
|
|
30
30
|
(): T;
|
|
31
|
-
subscribe: (subscriber: ReactiveSignalSubscriber<T>, timing?: Timing | null) => Unsubscribe;
|
|
31
|
+
subscribe: (subscriber: ReactiveSignalSubscriber<T>, timing?: Timing | null, deferInitial?: boolean) => Unsubscribe;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
34
|
* A Signal Subscriber is a function that will be called whenever the signal's value changes. The subscriber will be
|
|
@@ -76,7 +76,7 @@ export declare function reactiveSignal<T>(value: T, options?: SignalOptions<T>):
|
|
|
76
76
|
*
|
|
77
77
|
* The returned function can be called to unsubscribe from the Signal.
|
|
78
78
|
*/
|
|
79
|
-
export declare function subscribe<T>(signal: ReactiveSignal<T>,
|
|
79
|
+
export declare function subscribe<T>(signal: ReactiveSignal<T>, changeHandler: ReactiveSignalSubscriber<T>, timing?: Timing | null, deferInitial?: boolean): Unsubscribe;
|
|
80
80
|
/**
|
|
81
81
|
* Get notified when a Signal's subscribers changes from none to some or some to none.
|
|
82
82
|
*/
|
package/dist/reactiveSignal.js
CHANGED
|
@@ -9,7 +9,6 @@ export const Timing = {
|
|
|
9
9
|
globalThis.requestAnimationFrame(fn);
|
|
10
10
|
},
|
|
11
11
|
};
|
|
12
|
-
// The context for the current run and its unsubscribes
|
|
13
12
|
let context = null;
|
|
14
13
|
// A map to keep track of listeners to subscription changes
|
|
15
14
|
const onSubscriptionChanges = new WeakMap();
|
|
@@ -85,30 +84,33 @@ export function reactiveSignal(value, options) {
|
|
|
85
84
|
*
|
|
86
85
|
* The returned function can be called to unsubscribe from the Signal.
|
|
87
86
|
*/
|
|
88
|
-
export function subscribe(signal,
|
|
87
|
+
export function subscribe(signal, changeHandler, timing = Timing.Tick, deferInitial = false) {
|
|
88
|
+
let subscriber;
|
|
89
89
|
if (timing) {
|
|
90
90
|
let queued = false;
|
|
91
|
-
const subFn = subscriber;
|
|
92
91
|
subscriber = () => {
|
|
93
92
|
if (!queued) {
|
|
94
93
|
queued = true;
|
|
95
94
|
timing(() => {
|
|
96
95
|
queued = false;
|
|
97
|
-
|
|
96
|
+
changeHandler(signal());
|
|
98
97
|
});
|
|
99
98
|
}
|
|
100
99
|
};
|
|
101
100
|
}
|
|
101
|
+
else {
|
|
102
|
+
subscriber = changeHandler;
|
|
103
|
+
}
|
|
102
104
|
// Set the current context so we can get the unsubscribe
|
|
103
|
-
context = { subscriber, unsubscribes: new Set() };
|
|
105
|
+
context = { prior: context, subscriber, unsubscribes: new Set() };
|
|
104
106
|
// Get the current value of the signal
|
|
105
107
|
const value = signal();
|
|
106
108
|
// Get the unsubscribe function for the subscriber
|
|
107
109
|
const unsubscribe = context.unsubscribes.values().next().value;
|
|
108
110
|
// Clear the current context
|
|
109
|
-
context =
|
|
110
|
-
// Call the
|
|
111
|
-
subscriber(value);
|
|
111
|
+
context = context.prior;
|
|
112
|
+
// Call the changeHandler with the current value immediately, regardless of timing, unless deferred
|
|
113
|
+
deferInitial ? subscriber(value) : changeHandler(value);
|
|
112
114
|
// Return the unsubscribe function
|
|
113
115
|
return unsubscribe;
|
|
114
116
|
}
|
|
@@ -157,7 +159,7 @@ export function observe(fn, timing) {
|
|
|
157
159
|
return;
|
|
158
160
|
dirty = false;
|
|
159
161
|
// Set the context for the effect
|
|
160
|
-
context = { subscriber, unsubscribes: new Set() };
|
|
162
|
+
context = { prior: context, subscriber, unsubscribes: new Set() };
|
|
161
163
|
// Run the effect collecting all the unsubscribes from the signals that are called when it is run
|
|
162
164
|
fn();
|
|
163
165
|
// Filter out unchanged unsubscribes, leaving only those which no longer apply
|
|
@@ -167,7 +169,7 @@ export function observe(fn, timing) {
|
|
|
167
169
|
// Set the new unsubscribes
|
|
168
170
|
unsubscribes = context.unsubscribes;
|
|
169
171
|
// Clear the context
|
|
170
|
-
context =
|
|
172
|
+
context = context.prior;
|
|
171
173
|
};
|
|
172
174
|
// Call immediately (or on the next timing)
|
|
173
175
|
if (timing)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactiveSignal.js","sourceRoot":"","sources":["../src/reactiveSignal.ts"],"names":[],"mappings":"AASA,uEAAuE;AACvE,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,0DAA0D;IAC1D,IAAI,EAAE,CAAC,EAAc,EAAE,EAAE;QACvB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,mDAAmD;IACnD,cAAc,EAAE,CAAC,EAAc,EAAE,EAAE;QAChC,UAAkB,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;CACF,CAAC;
|
|
1
|
+
{"version":3,"file":"reactiveSignal.js","sourceRoot":"","sources":["../src/reactiveSignal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/reactiveSignal.ts
CHANGED
|
@@ -20,7 +20,8 @@ export const Timing = {
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
// The context for the current run and its unsubscribes
|
|
23
|
-
|
|
23
|
+
type Context = { prior: Context | null; subscriber: ReactiveSignalSubscriber<any>; unsubscribes: Set<Unsubscribe> };
|
|
24
|
+
let context: Context | null = null;
|
|
24
25
|
|
|
25
26
|
// A map to keep track of listeners to subscription changes
|
|
26
27
|
const onSubscriptionChanges = new WeakMap<ReactiveSignal<any>, Set<SubscriptionChange>>();
|
|
@@ -47,7 +48,7 @@ export interface ReactiveSignal<T> extends ComputedSignal<T> {
|
|
|
47
48
|
*/
|
|
48
49
|
export interface ComputedSignal<T> {
|
|
49
50
|
(): T;
|
|
50
|
-
subscribe: (subscriber: ReactiveSignalSubscriber<T>, timing?: Timing | null) => Unsubscribe;
|
|
51
|
+
subscribe: (subscriber: ReactiveSignalSubscriber<T>, timing?: Timing | null, deferInitial?: boolean) => Unsubscribe;
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
/**
|
|
@@ -168,25 +169,28 @@ export function reactiveSignal<T>(value: T, options?: SignalOptions<T>): Reactiv
|
|
|
168
169
|
*/
|
|
169
170
|
export function subscribe<T>(
|
|
170
171
|
signal: ReactiveSignal<T>,
|
|
171
|
-
|
|
172
|
-
timing: Timing | null = Timing.Tick
|
|
172
|
+
changeHandler: ReactiveSignalSubscriber<T>,
|
|
173
|
+
timing: Timing | null = Timing.Tick,
|
|
174
|
+
deferInitial = false
|
|
173
175
|
): Unsubscribe {
|
|
176
|
+
let subscriber: ReactiveSignalSubscriber<T>;
|
|
174
177
|
if (timing) {
|
|
175
178
|
let queued = false;
|
|
176
|
-
const subFn = subscriber;
|
|
177
179
|
subscriber = () => {
|
|
178
180
|
if (!queued) {
|
|
179
181
|
queued = true;
|
|
180
182
|
timing(() => {
|
|
181
183
|
queued = false;
|
|
182
|
-
|
|
184
|
+
changeHandler(signal());
|
|
183
185
|
});
|
|
184
186
|
}
|
|
185
187
|
};
|
|
188
|
+
} else {
|
|
189
|
+
subscriber = changeHandler;
|
|
186
190
|
}
|
|
187
191
|
|
|
188
192
|
// Set the current context so we can get the unsubscribe
|
|
189
|
-
context = { subscriber, unsubscribes: new Set() };
|
|
193
|
+
context = { prior: context, subscriber, unsubscribes: new Set() };
|
|
190
194
|
|
|
191
195
|
// Get the current value of the signal
|
|
192
196
|
const value = signal();
|
|
@@ -195,10 +199,10 @@ export function subscribe<T>(
|
|
|
195
199
|
const unsubscribe = context.unsubscribes.values().next().value;
|
|
196
200
|
|
|
197
201
|
// Clear the current context
|
|
198
|
-
context =
|
|
202
|
+
context = context.prior;
|
|
199
203
|
|
|
200
|
-
// Call the
|
|
201
|
-
subscriber(value);
|
|
204
|
+
// Call the changeHandler with the current value immediately, regardless of timing, unless deferred
|
|
205
|
+
deferInitial ? subscriber(value) : changeHandler(value);
|
|
202
206
|
|
|
203
207
|
// Return the unsubscribe function
|
|
204
208
|
return unsubscribe;
|
|
@@ -254,7 +258,7 @@ export function observe(fn: ReactiveSignalObserver, timing?: Timing): Unsubscrib
|
|
|
254
258
|
dirty = false;
|
|
255
259
|
|
|
256
260
|
// Set the context for the effect
|
|
257
|
-
context = { subscriber, unsubscribes: new Set() };
|
|
261
|
+
context = { prior: context, subscriber, unsubscribes: new Set() };
|
|
258
262
|
|
|
259
263
|
// Run the effect collecting all the unsubscribes from the signals that are called when it is run
|
|
260
264
|
fn();
|
|
@@ -269,7 +273,7 @@ export function observe(fn: ReactiveSignalObserver, timing?: Timing): Unsubscrib
|
|
|
269
273
|
unsubscribes = context.unsubscribes;
|
|
270
274
|
|
|
271
275
|
// Clear the context
|
|
272
|
-
context =
|
|
276
|
+
context = context.prior;
|
|
273
277
|
};
|
|
274
278
|
|
|
275
279
|
// Call immediately (or on the next timing)
|