Skip to content

Commit 880f717

Browse files
committed
Proof of concept: enhancer overhaul
1 parent d4f8cb9 commit 880f717

File tree

2 files changed

+35
-30
lines changed

2 files changed

+35
-30
lines changed

src/applyMiddleware.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import compose from './compose'
1919
export default function applyMiddleware(...middlewares) {
2020
return (createStore) => (reducer, initialState, enhancer) => {
2121
var store = createStore(reducer, initialState, enhancer)
22-
var dispatch
22+
var dispatch = store.dispatch
2323
var chain = []
2424

2525
var middlewareAPI = {

src/createStore.js

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import isPlainObject from 'lodash/isPlainObject'
2-
import warning from './utils/warning'
32
import $$observable from 'symbol-observable'
43

54
export var ActionTypes = {
65
INIT: '@@redux/INIT'
76
}
87

9-
function createBasicStore(reducer, initialState, onChange) {
8+
function createStoreBase(reducer, initialState, onChange) {
109
var currentState = initialState
1110
var isDispatching = false
1211

@@ -30,58 +29,70 @@ function createBasicStore(reducer, initialState, onChange) {
3029
if (isDispatching) {
3130
throw new Error('Reducers may not dispatch actions.')
3231
}
32+
3333
try {
3434
isDispatching = true
3535
currentState = reducer(currentState, action)
3636
} finally {
3737
isDispatching = false
3838
}
39+
3940
onChange()
4041
return action
4142
}
4243

4344
return {
4445
dispatch,
45-
getState,
46+
getState
4647
}
4748
}
4849

49-
export default function createEnhancedStore(reducer, initialState, enhancer) {
50+
export default function createStore(reducer, initialState, enhancer) {
5051
if (typeof reducer !== 'function') {
5152
throw new Error('Expected the reducer to be a function.')
5253
}
5354
if (typeof initialState === 'function' && typeof enhancer === 'undefined') {
5455
enhancer = initialState
5556
initialState = undefined
5657
}
57-
var createStore = createBasicStore
58-
if (typeof enhancer !== 'undefined') {
59-
if (typeof enhancer !== 'function') {
60-
throw new Error('Expected the enhancer to be a function.')
61-
}
62-
createStore = enhancer(createBasicStore)
58+
if (typeof enhancer !== 'undefined' && typeof enhancer !== 'function') {
59+
throw new Error('Expected the enhancer to be a function.')
6360
}
6461

65-
var store
62+
enhancer = enhancer || (x => x)
63+
var createFinalStoreBase = enhancer(createStoreBase)
64+
65+
var storeBase
6666
var currentListeners = []
6767
var nextListeners = currentListeners
6868

69+
function onChange() {
70+
var listeners = currentListeners = nextListeners
71+
for (var i = 0; i < listeners.length; i++) {
72+
listeners[i]()
73+
}
74+
}
75+
6976
function ensureCanMutateNextListeners() {
7077
if (nextListeners === currentListeners) {
7178
nextListeners = currentListeners.slice()
7279
}
7380
}
81+
7482
function subscribe(listener) {
7583
if (typeof listener !== 'function') {
7684
throw new Error('Expected listener to be a function.')
7785
}
86+
7887
var isSubscribed = true
7988
ensureCanMutateNextListeners()
8089
nextListeners.push(listener)
90+
8191
return function unsubscribe() {
8292
if (!isSubscribed) {
8393
return
8494
}
95+
8596
isSubscribed = false
8697
ensureCanMutateNextListeners()
8798
var index = nextListeners.indexOf(listener)
@@ -90,18 +101,21 @@ export default function createEnhancedStore(reducer, initialState, enhancer) {
90101
}
91102

92103
function dispatch(action) {
93-
return store.dispatch(action)
104+
return storeBase.dispatch(action)
94105
}
95106

96-
function onChange() {
97-
var listeners = currentListeners = nextListeners
98-
for (var i = 0; i < listeners.length; i++) {
99-
listeners[i]()
100-
}
107+
function getState() {
108+
return storeBase.getState()
101109
}
102110

103-
function getState() {
104-
return store.getState()
111+
function replaceReducer(nextReducer) {
112+
if (typeof nextReducer !== 'function') {
113+
throw new Error('Expected the nextReducer to be a function.')
114+
}
115+
116+
var nextInitialState = storeBase ? getState() : initialState
117+
storeBase = createFinalStoreBase(nextReducer, nextInitialState, onChange)
118+
dispatch({ type: ActionTypes.INIT })
105119
}
106120

107121
function observable() {
@@ -126,15 +140,6 @@ export default function createEnhancedStore(reducer, initialState, enhancer) {
126140
}
127141
}
128142

129-
function replaceReducer(nextReducer) {
130-
if (typeof nextReducer !== 'function') {
131-
throw new Error('Expected the nextReducer to be a function.')
132-
}
133-
134-
store = createStore(nextReducer, store ? getState() : initialState, onChange)
135-
dispatch({ type: ActionTypes.INIT })
136-
}
137-
138143
replaceReducer(reducer)
139144

140145
return {
@@ -144,4 +149,4 @@ export default function createEnhancedStore(reducer, initialState, enhancer) {
144149
replaceReducer,
145150
[$$observable]: observable
146151
}
147-
}
152+
}

0 commit comments

Comments
 (0)