11import { QSubscribers } from '../shared/utils/markers' ;
2- import type { ElementVNode , VNode , VirtualVNode } from '../client/types' ;
3- import {
4- ensureMaterialized ,
5- vnode_getProp ,
6- vnode_isElementVNode ,
7- vnode_setProp ,
8- } from '../client/vnode' ;
2+ import type { VNode } from '../client/types' ;
3+ import { ensureMaterialized , vnode_getProp , vnode_isElementVNode } from '../client/vnode' ;
94import { EffectSubscriptionsProp , WrappedSignal , isSignal , type Signal } from './signal' ;
105import type { Container } from '../shared/types' ;
116import { StoreHandler , getStoreHandler , isStore , type TargetType } from './store' ;
@@ -24,48 +19,28 @@ export function clearVNodeEffectDependencies(container: Container, value: VNode)
2419 if ( vnode_isElementVNode ( value ) ) {
2520 ensureMaterialized ( value ) ;
2621 }
27- const effects = vnode_getProp < Subscriber [ ] > ( value , QSubscribers , container . $getObjectById$ ) ;
22+ const effects = vnode_getProp < Set < Subscriber > > ( value , QSubscribers , container . $getObjectById$ ) ;
23+
2824 if ( ! effects ) {
2925 return ;
3026 }
31- for ( let i = effects . length - 1 ; i >= 0 ; i -- ) {
32- const subscriber = effects [ i ] ;
33- clearEffects ( subscriber , value , effects , i , container ) ;
34- }
35-
36- if ( effects . length === 0 ) {
37- vnode_setProp ( value as ElementVNode | VirtualVNode , QSubscribers , null ) ;
27+ for ( const subscriber of effects ) {
28+ clearEffects ( subscriber , value , effects , container ) ;
3829 }
3930}
4031
4132export function clearSubscriberEffectDependencies ( container : Container , value : Subscriber ) : void {
4233 if ( value . $effectDependencies$ ) {
4334 for ( const subscriber of value . $effectDependencies$ ) {
44- let subscriptionRemoved = false ;
45- const seenSet = new Set ( ) ;
46- if ( subscriber instanceof WrappedSignal ) {
47- subscriptionRemoved = clearSignalEffects ( subscriber , value , seenSet ) ;
48- } else if ( container . $storeProxyMap$ . has ( subscriber ) ) {
49- const store = container . $storeProxyMap$ . get ( subscriber ) ! ;
50- const handler = getStoreHandler ( store ) ! ;
51- subscriptionRemoved = clearStoreEffects ( handler , value ) ;
52- }
53- if ( subscriptionRemoved ) {
54- value . $effectDependencies$ . delete ( subscriber ) ;
55- }
56- }
57-
58- if ( value . $effectDependencies$ . size === 0 ) {
59- value . $effectDependencies$ . clear ( ) ;
35+ clearEffects ( subscriber , value , value . $effectDependencies$ , container ) ;
6036 }
6137 }
6238}
6339
6440function clearEffects (
6541 subscriber : Subscriber | TargetType ,
6642 value : Subscriber | VNode ,
67- effectArray : ( Subscriber | TargetType ) [ ] ,
68- indexToRemove : number ,
43+ effectArray : Set < Subscriber | TargetType > ,
6944 container : Container
7045) {
7146 let subscriptionRemoved = false ;
@@ -78,7 +53,7 @@ function clearEffects(
7853 subscriptionRemoved = clearStoreEffects ( handler , value ) ;
7954 }
8055 if ( subscriptionRemoved ) {
81- effectArray . splice ( indexToRemove , 1 ) ;
56+ effectArray . delete ( subscriber ) ;
8257 }
8358}
8459
0 commit comments