@lumieslab/stasho
Version:
lightweight state management library
101 lines (100 loc) • 3.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.combinedReducers = exports.subReducer = exports.filteredReducer = exports.actionWithoutParams = exports.actionWithParams = exports.isAction = exports.buildEffect = exports.buildReducer = exports.buildMemory = void 0;
function buildMemory(...callbacks) {
return function (input) {
return callbacks.reduce((acc, callback, i) => callback(acc), input);
};
}
exports.buildMemory = buildMemory;
function buildReducer(...callbacks) {
return (previousState, action) => {
return callbacks.reduce((state, reducerCallback) => reducerCallback(state, action), previousState);
};
}
exports.buildReducer = buildReducer;
function buildEffect(...callbacks) {
return (action) => callbacks.forEach((effectCallback) => effectCallback(action));
;
}
exports.buildEffect = buildEffect;
function isAction(actionA, actionB) {
if (typeof (actionA) === "object" && typeof (actionB) === "object") {
return actionA.type === actionB.type;
}
else if (typeof (actionA) === "object") {
return actionA.type === actionB;
}
else if (typeof (actionB) === "object") {
return actionA === actionB.type;
}
else {
return actionA === actionB;
}
}
exports.isAction = isAction;
function actionWithParams(type) {
const callback = (params) => {
return Object.assign({ type }, params);
};
const callbackContext = {
type,
equals: (action) => {
if (typeof action == "object") {
return action.type === type;
}
else {
return action === type;
}
}
};
return Object.assign(callback, callbackContext);
}
exports.actionWithParams = actionWithParams;
function actionWithoutParams(type) {
const callback = () => ({
type
});
const callbackContext = {
type,
equals: (action) => {
if (typeof action == "object") {
return action.type === type;
}
else {
return action === type;
}
}
};
return Object.assign(callback, callbackContext);
}
exports.actionWithoutParams = actionWithoutParams;
function filteredReducer(whitelist, callback) {
return (state, action) => {
// Filter out action types
const isActionWhitelisted = whitelist.find((actionCaller) => {
return actionCaller().type == action.type;
});
// Call the action if it's whitelisted
if (isActionWhitelisted) {
return callback(state, action);
}
else {
return state;
}
};
}
exports.filteredReducer = filteredReducer;
function subReducer(slice, callback) {
return (state, action) => {
state[slice] = callback(state[slice], action);
return state;
};
}
exports.subReducer = subReducer;
function combinedReducers(...callbacks) {
return (startingState, action) => {
return callbacks.reduce((state, reducer) => reducer(state, action), startingState);
};
}
exports.combinedReducers = combinedReducers;