purify lib.gnc

This commit is contained in:
Rintim 2023-09-10 15:58:51 +08:00
parent 78f6a550c4
commit 4594fb82cb
1 changed files with 32 additions and 21 deletions

View File

@ -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={