UNPKG

@mic-rexjs/usecases

Version:
37 lines (36 loc) 1.37 kB
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); }); });