Skip to content

Commit e90a721

Browse files
committed
Use mutable versions of ObserverState
1 parent 1184c03 commit e90a721

File tree

3 files changed

+51
-59
lines changed

3 files changed

+51
-59
lines changed

src/reactor.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class Reactor {
4545
this.reactorState = initialReactorState
4646
this.observerState = new ObserverState()
4747

48+
this.observerState = this.observerState.asMutable()
49+
4850
this.ReactMixin = createReactMixin(this)
4951

5052
// keep track of the depth of batch nesting
@@ -108,10 +110,9 @@ class Reactor {
108110
handler = getter
109111
getter = []
110112
}
111-
let { observerState, entry } = fns.addObserver(this.reactorState, this.observerState, getter, handler)
112-
this.observerState = observerState
113+
let entry = fns.addObserver(this.reactorState, this.observerState, getter, handler)
113114
return () => {
114-
this.observerState = fns.removeObserverByEntry(this.reactorState, this.observerState, entry)
115+
fns.removeObserverByEntry(this.reactorState, this.observerState, entry)
115116
}
116117
}
117118

@@ -123,7 +124,7 @@ class Reactor {
123124
throw new Error('Must call unobserve with a Getter')
124125
}
125126

126-
this.observerState = fns.removeObserver(this.reactorState, this.observerState, getter, handler)
127+
fns.removeObserver(this.reactorState, this.observerState, getter, handler)
127128
}
128129

129130
/**

src/reactor/fns.js

+42-51
Original file line numberDiff line numberDiff line change
@@ -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
*/
268261
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+
}
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
/**

src/reactor/records.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export const ObserverState = Record({
5858
<Keypath>: Set<ObserverEntry>
5959
}
6060
*/
61-
keypathToEntries: Map({}),
61+
keypathToEntries: Map({}).asMutable(),
6262

6363
/*
6464
{
@@ -67,11 +67,11 @@ export const ObserverState = Record({
6767
}
6868
}
6969
*/
70-
observersMap: Map({}),
70+
observersMap: Map({}).asMutable(),
7171

72-
trackedKeypaths: Set(),
72+
trackedKeypaths: Set().asMutable(),
7373

7474
// keep a flat set of observers to know when one is removed during a handler
75-
observers: Set(),
75+
observers: Set().asMutable(),
7676
})
7777

0 commit comments

Comments
 (0)