-
-
Save chentsulin/2a80ee36c032be198c45 to your computer and use it in GitHub Desktop.
Redux without the sanity checks in a single file. Don't use this, use normal Redux. :-) . Simplify for beginner
This file contains hidden or 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 { mapValues, pick, compose } from 'lodash'; | |
function bindActionCreator(actionCreator, dispatch) { | |
return (...args) => dispatch(actionCreator(...args)); | |
} | |
export function bindActionCreators(actionCreators, dispatch) { | |
return typeof actionCreators === 'function' ? | |
bindActionCreator(actionCreators, dispatch) : | |
mapValues(actionCreators, actionCreator => | |
bindActionCreator(actionCreator, dispatch) | |
); | |
} | |
/* applyMiddleware is totally optional. You can ignore this at the beginning. */ | |
// export function applyMiddleware(...middlewares) { | |
// return (next) => (reducer, initialState) => { | |
// var store = next(reducer, initialState); | |
// var dispatch = store.dispatch; | |
// var chain = []; | |
// chain = middlewares.map(middleware => middleware({ | |
// getState: store.getState, | |
// dispatch: (action) => dispatch(action) | |
// })); | |
// dispatch = compose(...chain)(store.dispatch); | |
// return { ...store, dispatch }; | |
// }; | |
// } | |
export function combineReducers(reducers) { | |
var finalReducers = pick(reducers, (val) => typeof val === 'function'); | |
return (state = {}, action) => mapValues(finalReducers, | |
(reducer, key) => reducer(state[key], action) | |
); | |
} | |
export function createStore(reducer, initialState) { | |
var currentReducer = reducer; | |
var currentState = initialState; | |
var listeners = []; | |
var isDispatching = false; | |
function getState() { | |
return currentState; | |
} | |
function subscribe(listener) { | |
listeners.push(listener); | |
return function unsubscribe() { | |
var index = listeners.indexOf(listener); | |
listeners.splice(index, 1); | |
}; | |
} | |
function dispatch(action) { | |
if (isDispatching) { | |
throw new Error('Reducers may not dispatch actions.'); | |
} | |
try { | |
isDispatching = true; | |
currentState = currentReducer(currentState, action); | |
} finally { | |
isDispatching = false; | |
} | |
listeners.slice().forEach(listener => listener()); | |
return action; | |
} | |
function replaceReducer(nextReducer) { | |
currentReducer = nextReducer; | |
dispatch({ type: '@@redux/INIT' }); | |
} | |
dispatch({ type: '@@redux/INIT' }); | |
return { dispatch, subscribe, getState, replaceReducer }; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment