@@ -188,27 +188,22 @@ export function addObserver(reactorState, observerState, getter, handler) {
188
188
handler : handler ,
189
189
} )
190
190
191
- let updatedObserverState = observerState . withMutations ( map => {
192
- keypathDeps . forEach ( keypath => {
193
- map . updateIn ( [ 'keypathToEntries' , keypath ] , entries => {
194
- return ( entries )
195
- ? entries . add ( entry )
196
- : Immutable . Set ( ) . add ( entry )
197
- } )
198
- } )
191
+ const keypathToEntries = observerState . get ( 'keypathToEntries' )
192
+
193
+ keypathDeps . forEach ( keypath => {
194
+ if ( ! keypathToEntries . has ( keypath ) ) {
195
+ keypathToEntries . set ( keypath , Immutable . Set ( ) . asMutable ( ) . add ( entry ) )
196
+ } else {
197
+ keypathToEntries . get ( keypath ) . add ( entry )
198
+ }
199
199
} )
200
200
201
201
const getterKey = createGetterKey ( getter ) ;
202
+ observerState . get ( 'trackedKeypaths' ) . union ( keypathDeps )
203
+ observerState . get ( 'observersMap' ) . setIn ( [ getterKey , handler ] , entry )
204
+ observerState . get ( 'observers' ) . add ( entry )
202
205
203
- const finalObserverState = updatedObserverState
204
- . update ( 'trackedKeypaths' , keypaths => keypaths . union ( keypathDeps ) )
205
- . setIn ( [ 'observersMap' , getterKey , handler ] , entry )
206
- . update ( 'observers' , observers => observers . add ( entry ) )
207
-
208
- return {
209
- observerState : finalObserverState ,
210
- entry : entry ,
211
- }
206
+ return entry
212
207
}
213
208
214
209
/**
@@ -254,9 +249,7 @@ export function removeObserver(reactorState, observerState, getter, handler) {
254
249
entriesToRemove = observerState . getIn ( [ 'observersMap' , getterKey ] , Immutable . Map ( { } ) ) . toList ( )
255
250
}
256
251
257
- return observerState . withMutations ( map => {
258
- entriesToRemove . forEach ( entry => removeObserverByEntry ( reactorState , map , entry , keypathDeps ) )
259
- } )
252
+ entriesToRemove . forEach ( entry => removeObserverByEntry ( reactorState , map , entry , keypathDeps ) )
260
253
}
261
254
262
255
/**
@@ -266,42 +259,40 @@ export function removeObserver(reactorState, observerState, getter, handler) {
266
259
* @return {ObserverState }
267
260
*/
268
261
export function removeObserverByEntry ( reactorState , observerState , entry , keypathDeps = null ) {
269
- return observerState . withMutations ( map => {
270
- const getter = entry . get ( 'getter' )
271
- if ( ! keypathDeps ) {
272
- const maxCacheDepth = getOption ( reactorState , 'maxCacheDepth' )
273
- keypathDeps = getCanonicalKeypathDeps ( getter , maxCacheDepth )
274
- }
262
+ const getter = entry . get ( 'getter' )
263
+ if ( ! keypathDeps ) {
264
+ const maxCacheDepth = getOption ( reactorState , 'maxCacheDepth' )
265
+ keypathDeps = getCanonicalKeypathDeps ( getter , maxCacheDepth )
266
+ }
275
267
276
- map . update ( 'observers' , observers => observers . remove ( entry ) )
268
+ observerState . get ( 'observers' ) . remove ( entry )
277
269
278
- // update the keypathToEntries
279
- keypathDeps . forEach ( keypath => {
280
- const kp = [ 'keypathToEntries' , keypath ]
281
- map . updateIn ( kp , entries => {
282
- // check for observers being present because reactor.reset() can be called before an unwatch fn
283
- return ( entries )
284
- ? entries . remove ( entry )
285
- : entries
286
- } )
287
- // protect against unwatch after reset
288
- if ( map . hasIn ( kp ) &&
289
- map . getIn ( kp ) . size === 0 ) {
290
- map . removeIn ( kp )
291
- map . update ( 'trackedKeypaths' , keypaths => keypaths . remove ( keypath ) )
292
- }
293
- } )
270
+ // update the keypathToEntries
271
+ keypathDeps . forEach ( keypath => {
272
+ const kp = [ 'keypathToEntries' , keypath ]
273
+ const entries = observerState . getIn ( kp )
294
274
295
- // remove entry from observersMap
296
- const getterKey = createGetterKey ( getter )
297
- const handler = entry . get ( 'handler' )
298
- map . removeIn ( [ 'observersMap' , getterKey , handler ] )
299
- // protect against unwatch after reset
300
- if ( map . hasIn ( [ 'observersMap' , getterKey ] ) &&
301
- map . getIn ( [ 'observersMap' , getterKey ] ) . size === 0 ) {
302
- map . removeIn ( [ 'observersMap' , getterKey ] )
275
+ if ( entries ) {
276
+ // check for observers being present because reactor.reset() can be called before an unwatch fn
277
+ entries . remove ( entry )
278
+ if ( entries . size === 0 ) {
279
+ observerState . removeIn ( kp )
280
+ observerState . get ( 'trackedKeypaths' ) . remove ( keypath )
281
+ }
303
282
}
304
283
} )
284
+
285
+ // remove entry from observersobserverState
286
+ const getterKey = createGetterKey ( getter )
287
+ const handler = entry . get ( 'handler' )
288
+
289
+ const observersMap = observerState . get ( 'observersMap' )
290
+ observersMap . removeIn ( [ getterKey , handler ] )
291
+ // protect against unwatch after reset
292
+ if ( observersMap . has ( getterKey ) &&
293
+ observersMap . get ( getterKey ) . size === 0 ) {
294
+ observersMap . remove ( getterKey )
295
+ }
305
296
}
306
297
307
298
/**
0 commit comments