Created
August 10, 2017 04:59
-
-
Save sudheerDev/5c89b9f419a632af5dcc394efc6f47cd to your computer and use it in GitHub Desktop.
bare bones of redux createStore.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import isPlainObject from 'lodash/isPlainObject' | |
import $$observable from 'symbol-observable' | |
export var ActionTypes = { | |
INIT: '@@redux/INIT' | |
} | |
export default function createStore(reducer, preloadedState, enhancer) { | |
if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { | |
enhancer = preloadedState | |
preloadedState = undefined | |
} | |
if (typeof enhancer !== 'undefined') { | |
if (typeof enhancer !== 'function') { | |
throw new Error('Expected the enhancer to be a function.') | |
} | |
return enhancer(createStore)(reducer, preloadedState) | |
} | |
if (typeof reducer !== 'function') { | |
throw new Error('Expected the reducer to be a function.') | |
} | |
var currentReducer = reducer | |
var currentState = preloadedState | |
var currentListeners = [] | |
var nextListeners = currentListeners | |
var isDispatching = false | |
function ensureCanMutateNextListeners() { | |
if (nextListeners === currentListeners) { | |
nextListeners = currentListeners.slice() | |
} | |
} | |
function getState() { | |
return currentState | |
} | |
function subscribe(listener) { | |
if (typeof listener !== 'function') { | |
throw new Error('Expected listener to be a function.') | |
} | |
var isSubscribed = true | |
ensureCanMutateNextListeners() | |
nextListeners.push(listener) | |
return function unsubscribe() { | |
if (!isSubscribed) { | |
return | |
} | |
isSubscribed = false | |
ensureCanMutateNextListeners() | |
var index = nextListeners.indexOf(listener) | |
nextListeners.splice(index, 1) | |
} | |
} | |
function dispatch(action) { | |
if (!isPlainObject(action)) { | |
throw new Error( | |
'Actions must be plain objects. ' + | |
'Use custom middleware for async actions.' | |
) | |
} | |
if (typeof action.type === 'undefined') { | |
throw new Error( | |
'Actions may not have an undefined "type" property. ' + | |
'Have you misspelled a constant?' | |
) | |
} | |
if (isDispatching) { | |
throw new Error('Reducers may not dispatch actions.') | |
} | |
try { | |
isDispatching = true | |
currentState = currentReducer(currentState, action) | |
} finally { | |
isDispatching = false | |
} | |
var listeners = currentListeners = nextListeners | |
for (var i = 0; i < listeners.length; i++) { | |
listeners[i]() | |
} | |
return action | |
} | |
function replaceReducer(nextReducer) { | |
if (typeof nextReducer !== 'function') { | |
throw new Error('Expected the nextReducer to be a function.') | |
} | |
currentReducer = nextReducer | |
dispatch({ type: ActionTypes.INIT }) | |
} | |
function observable() { | |
var outerSubscribe = subscribe | |
return { | |
subscribe(observer) { | |
if (typeof observer !== 'object') { | |
throw new TypeError('Expected the observer to be an object.') | |
} | |
function observeState() { | |
if (observer.next) { | |
observer.next(getState()) | |
} | |
} | |
observeState() | |
var unsubscribe = outerSubscribe(observeState) | |
return { unsubscribe } | |
}, | |
[$$observable]() { | |
return this | |
} | |
} | |
} | |
dispatch({ type: ActionTypes.INIT }) | |
return { | |
dispatch, | |
subscribe, | |
getState, | |
replaceReducer, | |
[$$observable]: observable | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment