Skip to content

Instantly share code, notes, and snippets.

@chentsulin
Forked from gaearon/slim-redux.js
Last active September 23, 2015 00:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chentsulin/2a80ee36c032be198c45 to your computer and use it in GitHub Desktop.
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
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