diff --git a/game/game.js b/game/game.js index c50d18f47..f32bfd68c 100644 --- a/game/game.js +++ b/game/game.js @@ -33,32 +33,43 @@ // gnc: GeNCoroutine const gnc={ async:fn=>function genCoroutine(){ - return gnc.await(fn.apply(this,arguments)) + let result=fn.apply(this,arguments); + result.name="genCoroutine"; + result.status="next"; + result.state=undefined; + return gnc.await(result); }, await:gen=>new Promise((resolve,reject)=>{ - const _next=value=>gnc.next(gen,resolve,reject,"next",value,_next,_throw); - const _throw=err=>gnc.next(gen,resolve,reject,"throw",err,_next,_throw); - _next(undefined); + let result=gen; + let nexts=resolve; + let throws=reject; + if(gnc.is.coroutine(gen)) { + try{ + result=gen[result.status](result.state); + }catch(error){ + reject(error); + return; + } + if(!result.done){ + nexts=(item)=>{ + gen.state=item; + gen.status="next"; + gnc.await(gen).then(resolve,reject); + } + throws=(err)=>{ + gen.state=err; + gen.status="throw"; + gnc.await(gen).then(resolve,reject); + } + } + result=result.value; + } + Promise.resolve(result).then(nexts,throws); }), is:{ - coroutine:item=>typeof item=="function"&&item.name=="genCoroutine", + coroutine:item=>(typeof item=="function"||gnc.is.generator(item))&&item.name=="genCoroutine", generatorFunc:item=>item instanceof GeneratorFunction, - generator:item=>item.constructor==GeneratorFunction - }, - next:(gen,resolve,reject,key,arg,_next,_throw)=>{ - let info,value; - try{ - info=gen[key](arg); - value=info.value; - }catch(error){ - reject(error); - return; - } - if(info.done){ - resolve(value); - }else{ - Promise.resolve(value).then(_next,_throw); - } + generator:item=>item.constructor.constructor==GeneratorFunction } }; const _status={