UNPKG

@mic-rexjs/usecases

Version:
48 lines (47 loc) 2 kB
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; };