Skip to content

Instantly share code, notes, and snippets.

@derhuerst
Last active January 18, 2016 17:17
Show Gist options
  • Save derhuerst/7400f8285e13bf47243a to your computer and use it in GitHub Desktop.
Save derhuerst/7400f8285e13bf47243a to your computer and use it in GitHub Desktop.
A minimal Redux clone.
module.exports = Object.freeze({
createSelector: function (selector, processor) {
var cache = {}, processed;
return function (state) {
var selected = selector(state);
if (selected !== cache) {
processed = processor(selected);
cache = selected;
}
return processed;
};
},
createStore: function (state, reducer) {
var listeners = [];
return {
state: function () { return state; },
dispatch: function (action) {
var newState = reducer(state, action);
if (newState !== state) {
state = newState;
for (var i = 0; i < listeners.length; i++) {
listeners[i](state);
}
}
},
subscribe: function (listener) {
listeners.push(listener);
return this;
}
};
},
upstream: function (store, app, handlers) {
Object.keys(handlers).forEach(function (key) {
app[key] = handlers[key].bind(store.dispatch);
});
},
downstream: function (store, app, handlers) {
var keys = Object.keys(handlers);
store.subscribe(function (state) {
keys.forEach(function (key) {
app[key] = handlers[key](state);
});
});
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment