@@ -188,27 +188,22 @@ export function addObserver(reactorState, observerState, getter, handler) {
188188 handler : handler ,
189189 } )
190190
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+ }
199199 } )
200200
201201 const getterKey = createGetterKey ( getter ) ;
202+ observerState . get ( 'trackedKeypaths' ) . union ( keypathDeps )
203+ observerState . get ( 'observersMap' ) . setIn ( [ getterKey , handler ] , entry )
204+ observerState . get ( 'observers' ) . add ( entry )
202205
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
212207}
213208
214209/**
@@ -254,9 +249,7 @@ export function removeObserver(reactorState, observerState, getter, handler) {
254249 entriesToRemove = observerState . getIn ( [ 'observersMap' , getterKey ] , Immutable . Map ( { } ) ) . toList ( )
255250 }
256251
257- return observerState . withMutations ( map => {
258- entriesToRemove . forEach ( entry => removeObserverByEntry ( reactorState , map , entry , keypathDeps ) )
259- } )
252+ entriesToRemove . forEach ( entry => removeObserverByEntry ( reactorState , map , entry , keypathDeps ) )
260253}
261254
262255/**
@@ -266,42 +259,40 @@ export function removeObserver(reactorState, observerState, getter, handler) {
266259 * @return {ObserverState }
267260 */
268261export 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+ }
275267
276- map . update ( 'observers' , observers => observers . remove ( entry ) )
268+ observerState . get ( 'observers' ) . remove ( entry )
277269
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 )
294274
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+ }
303282 }
304283 } )
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+ }
305296}
306297
307298/**
0 commit comments