@mic-rexjs/usecases
Version:
Usecases of Clean Architecture
48 lines (47 loc) • 2 kB
JavaScript
import { generateEntity } from '../generateEntity';
import { EntityStore } from '../../classes/EntityStore';
import { isGenerator } from '../isGenerator';
import { entityUseCase } from '../../usecases/entityUseCase';
export const createEntityReducers = (arg1, arg2, arg3) => {
const hasEntity = typeof arg2 === 'function';
const initialEntity = (hasEntity ? arg1 : null);
const store = initialEntity instanceof EntityStore ? initialEntity : new EntityStore(initialEntity);
const usecase = (hasEntity ? arg2 : arg1);
const options = (hasEntity ? arg3 : arg2);
const { onYield = (entity) => {
return entity;
}, onReturn, onGenerate, ...usecaseOptions } = options || {};
const smoothedReducers = {};
const entityReducers = entityUseCase();
const usecaseReducers = usecase(usecaseOptions);
const sourceReducers = { ...entityReducers, ...usecaseReducers };
const keys = Object.keys(sourceReducers);
const { setEntity } = sourceReducers;
keys.forEach((key) => {
const reducer = sourceReducers[key];
smoothedReducers[key] = ((...args) => {
const reducerArgs = (hasEntity ? [store.value, ...args] : args);
const ret = reducer(...reducerArgs);
if (!hasEntity) {
store.value = args[0];
}
if (!isGenerator(ret)) {
return ret;
}
return generateEntity(ret, {
store,
onYield(newEntity, oldEntity) {
let entity = newEntity;
if (reducer !== setEntity) {
// 不能使用第 `0` 项,不一定会有 `yeild`,但一定会有 `return`
[, entity] = generateEntity(setEntity(oldEntity, newEntity));
}
return onYield(entity);
},
onReturn,
onGenerate,
});
});
});
return smoothedReducers;
};