@@ -4,11 +4,10 @@ export interface IEffect extends Subscriber {
4
4
}
5
5
6
6
export interface IComputed extends Dependency , Subscriber {
7
- update ( ) : any ;
7
+ update ( ) : boolean ;
8
8
}
9
9
10
10
export interface Dependency {
11
- currentValue ?: any ;
12
11
subs : Link | undefined ;
13
12
subsTail : Link | undefined ;
14
13
lastTrackedId ?: number ;
@@ -23,7 +22,6 @@ export interface Subscriber {
23
22
export interface Link {
24
23
dep : Dependency | IComputed | ( Dependency & IEffect ) ;
25
24
sub : Subscriber | IComputed | ( Dependency & IEffect ) | IEffect ;
26
- value : any ;
27
25
// Reuse to link prev stack in checkDirty
28
26
// Reuse to link prev stack in propagate
29
27
prevSub : Link | undefined ;
@@ -96,7 +94,6 @@ function linkNewDep(dep: Dependency, sub: Subscriber, nextDep: Link | undefined,
96
94
newLink = {
97
95
dep,
98
96
sub,
99
- value : undefined ,
100
97
nextDep,
101
98
prevSub : undefined ,
102
99
nextSub : undefined ,
@@ -227,7 +224,18 @@ export function propagate(subs: Link): void {
227
224
}
228
225
}
229
226
230
- function isValidLink ( subLink : Link , sub : Subscriber ) {
227
+ export function shallowPropagate ( link : Link ) : void {
228
+ do {
229
+ const updateSub = link . sub ;
230
+ const updateSubFlags = updateSub . flags ;
231
+ if ( ! ( updateSubFlags & ( SubscriberFlags . Dirty | SubscriberFlags . Tracking ) ) ) {
232
+ updateSub . flags = updateSubFlags | SubscriberFlags . Dirty ;
233
+ }
234
+ link = link . nextSub ! ;
235
+ } while ( link !== undefined ) ;
236
+ }
237
+
238
+ export function isValidLink ( subLink : Link , sub : Subscriber ) : boolean {
231
239
const depsTail = sub . depsTail ;
232
240
if ( depsTail !== undefined ) {
233
241
let link = sub . deps ! ;
@@ -256,16 +264,21 @@ export function checkDirty(link: Link): boolean {
256
264
if ( 'update' in dep ) {
257
265
const depFlags = dep . flags ;
258
266
if ( depFlags & SubscriberFlags . Dirty ) {
259
- if ( dep . update ( ) !== link . value ) {
267
+ if ( dep . update ( ) ) {
268
+ const subs = dep . subs ! ;
269
+ if ( subs . nextSub !== undefined ) {
270
+ shallowPropagate ( subs ) ;
271
+ }
260
272
dirty = true ;
261
273
}
262
274
} else if ( depFlags & SubscriberFlags . ToCheckDirty ) {
263
- dep . subs ! . prevSub = link ;
275
+ const depSubs = dep . subs ! ;
276
+ if ( depSubs . nextSub !== undefined ) {
277
+ depSubs . prevSub = link ;
278
+ }
264
279
link = dep . deps ! ;
265
280
++ stack ;
266
281
continue ;
267
- } else if ( dep . currentValue !== link . value ) {
268
- dirty = true ;
269
282
}
270
283
}
271
284
if ( dirty || ( nextDep = link . nextDep ) === undefined ) {
@@ -274,20 +287,28 @@ export function checkDirty(link: Link): boolean {
274
287
do {
275
288
-- stack ;
276
289
const subSubs = sub . subs ! ;
277
- const prevLink = subSubs . prevSub ! ;
278
- subSubs . prevSub = undefined ;
279
- if ( dirty ) {
280
- if ( sub . update ( ) !== prevLink . value ) {
281
- sub = prevLink . sub as IComputed ;
282
- continue ;
290
+ let prevLink = subSubs . prevSub ! ;
291
+ if ( prevLink !== undefined ) {
292
+ subSubs . prevSub = undefined ;
293
+ if ( dirty ) {
294
+ if ( sub . update ( ) ) {
295
+ shallowPropagate ( sub . subs ! ) ;
296
+ sub = prevLink . sub as IComputed ;
297
+ continue ;
298
+ }
299
+ } else {
300
+ sub . flags &= ~ SubscriberFlags . ToCheckDirty ;
283
301
}
284
302
} else {
285
- sub . flags &= ~ SubscriberFlags . ToCheckDirty ;
286
- if ( sub . currentValue !== prevLink . value ) {
287
- dirty = true ;
288
- sub = prevLink . sub as IComputed ;
289
- continue ;
303
+ if ( dirty ) {
304
+ if ( sub . update ( ) ) {
305
+ sub = subSubs . sub as IComputed ;
306
+ continue ;
307
+ }
308
+ } else {
309
+ sub . flags &= ~ SubscriberFlags . ToCheckDirty ;
290
310
}
311
+ prevLink = subSubs ;
291
312
}
292
313
link = prevLink . nextDep ! ;
293
314
if ( link !== undefined ) {
@@ -350,7 +371,6 @@ function clearTrack(link: Link): void {
350
371
link . dep = undefined ;
351
372
// @ts -expect-error
352
373
link . sub = undefined ;
353
- link . value = undefined ;
354
374
link . nextDep = linkPool ;
355
375
linkPool = link ;
356
376
0 commit comments