@mic-rexjs/usecases
Version:
Usecases of Clean Architecture
37 lines (36 loc) • 1.37 kB
JavaScript
import { EntityStore } from '../../classes/EntityStore';
import { isGenerator } from '../isGenerator';
export const generateEntity = ((generator, options = {}) => {
const results = [];
const isAsync = isGenerator(generator, Symbol.asyncIterator);
const { store = new EntityStore(void 0), onYield = (entity) => {
return entity;
}, onReturn = (result) => {
return result;
}, onGenerate = (entity, result) => {
return [entity, result];
}, } = options;
const generate = async () => {
for (;;) {
const ret = generator.next(store.value);
const syncRet = ret;
const asyncRet = ret;
const { value, done } = isAsync ? await asyncRet : syncRet;
const { value: currentEntity } = store;
if (done) {
const result = onReturn(value, currentEntity);
results[0] = result;
return [currentEntity, result];
}
const newEntity = onYield(typeof value === 'function' ? value(currentEntity) : value, currentEntity);
store.setValue(newEntity);
}
};
const promise = generate();
if (results.length > 0) {
return onGenerate(store.value, results[0]);
}
return promise.then(([entity, result]) => {
return onGenerate(entity, result);
});
});