nedux
Version:
the next redux state management
39 lines • 1.41 kB
JavaScript
import { BehaviorSubject } from 'rxjs';
export const createStore = (initState, middlewares = []) => {
// Map each `initState` entiries to a BehaviorSubject
const subjects = Object.keys(initState).reduce((acc, key) => {
const defaultValue = initState[key];
const subject = new BehaviorSubject(defaultValue);
return { ...acc, [key]: subject };
}, {});
/**
* Get the stored value at the key
* @param key target key
*/
const get = (key) => {
return subjects[key].getValue();
};
/**
* Set a new value of the propertie `key` of the store
* @param key target key
* @param value new value
*/
const set = (key, value) => {
subjects[key].next(typeof value === 'function' ? value(get(key)) : value);
};
// @todo conditional typing return
/**
* Subscribe to a key of the store
* @param key target key you want to subscribe
* @param observer observer that will be called each time the value of key has changed
*/
const subscribe = (key, observer) => key === ''
? Object.values(subjects).map(sub => sub.subscribe(observer))
: subjects[key].subscribe(observer);
// Create the store
const store = { get, set, subscribe };
// Intialize all middlewares
middlewares.forEach(factory => factory(store));
return store;
};
//# sourceMappingURL=store.js.map