package Ġcom . fire fly source . common . coroutine Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ Ċ /** Ċ Ġ* ĠRet ain Ġa Ġvalue Ġin Ġthe Ġcoroutine Ġscope . Ċ Ġ* Ċ Ġ* Ġ@ author ĠPeng ta o ĠQ iu Ċ Ġ*/ Ċ class ĠCor outine Local < T > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġthread Local Ġ= ĠThread Local < T >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġa Ġvalue Ġto Ġthe Ġcoroutine Ġcontext Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠA Ġvalue Ġruns Ġthrough Ġin Ġthe Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcoroutine Ġcontext Ġelement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġas Element ( value : ĠT ) Ġ= Ġthread Local . as Context Element ( value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġvalue Ġin Ġthe Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġin Ġthe Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget (): ĠT ? Ġ= Ġthread Local . get () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġvalue Ġin Ġthe Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠThe Ġvalue Ġin Ġthe Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset ( value : ĠT ?) Ġ= Ġthread Local . set ( value ) Ċ } Ċ Ċ /** Ċ Ġ* ĠRet ain Ġthe Ġattributes Ġin Ġthe Ġcoroutine Ġscope . Ċ Ġ* Ċ Ġ* Ġ@ author ĠPeng ta o ĠQ iu Ċ Ġ*/ Ċ object ĠCor outine Local Context Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġctx : ĠCor outine Local < Mutable Map < String , ĠAny >> Ġby Ġlazy Ġ{ ĠCor outine Local () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġthe Ġattributes Ġto Ġthe Ġcoroutine Ġcontext Ġelement . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġattributes ĠThe Ġattributes Ġrun Ġthrough Ġin Ġthe Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcoroutine Ġcontext Ġelement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġas Element ( attributes : ĠMutable Map < String , ĠAny >): ĠThread Context Element < Mutable Map < String , ĠAny >> Ġ= ĊĠĠĠĠĠĠĠ Ġctx . as Element ( HashMap ( attributes )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInherit Ġparent Ġcoroutine Ġcontext Ġelement , Ġand Ġmerge Ġit Ġinto Ġcurrent Ġattributes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġattributes ĠThe Ġattributes Ġrun Ġthrough Ġin Ġthe Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcoroutine Ġcontext Ġelement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinherit Parent Element ( attributes : ĠMutable Map < String , ĠAny >? Ġ= Ġnull ): ĠThread Context Element < Mutable Map < String , ĠAny >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Attributes Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġval Ġparent Attributes Ġ= Ġget Attributes () ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Attributes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Attributes . put All ( parent Attributes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( attributes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Attributes . put All ( attributes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġctx . as Element ( new Attributes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġcurrent Ġattributes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcurrent Ġattributes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Attributes (): ĠMutable Map < String , ĠAny >? Ġ= Ġctx . get () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġan Ġattribute Ġin Ġthe Ġcurrent Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠThe Ġname Ġof Ġattribute . ĊĠĠĠĠ Ġ* Ġ@ return ĠAn Ġattribute Ġin Ġthe Ġcurrent Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġget Attr ( name : ĠString ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Attributes ()?. get ( name ) Ġas ĠT ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġan Ġattribute Ġin Ġthe Ġcurrent Ġcoroutine Ġscope , Ġif Ġthe Ġvalue Ġis Ġnull Ġreturn Ġthe Ġdefault Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠThe Ġname Ġof Ġattribute . ĊĠĠĠĠ Ġ* Ġ@ param Ġfunc ĠGet Ġthe Ġdefault Ġvalue Ġl az ily . ĊĠĠĠĠ Ġ* Ġ@ return ĠAn Ġattribute Ġin Ġthe Ġcurrent Ġcoroutine Ġscope , Ġor Ġthe Ġdefault Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġget Attr OrDefault ( name : ĠString , Ġcross inline Ġfunc : Ġ( String ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Attributes ()?. get ( name ) Ġas ĠT ? Ġ?: Ġfunc ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġan Ġattribute Ġin Ġthe Ġcurrent Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠThe Ġattribute 's Ġname . ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠThe Ġattribute 's Ġvalue . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġold Ġvalue Ġin Ġthe Ġcurrent Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġset Attr ( name : ĠString , Ġvalue : ĠT ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Attributes ()?. put ( name , Ġvalue ) Ġas ĠT ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġspecified Ġattribute Ġname Ġdoes Ġnot Ġalready Ġassociate Ġwith Ġa Ġvalue Ġ( or Ġis Ġmapped ĊĠĠĠĠ Ġ* Ġto Ġnull ), Ġattempts Ġto Ġcompute Ġits Ġvalue Ġusing Ġthe Ġgiven Ġmapping ĊĠĠĠĠ Ġ* Ġfunction Ġand Ġent ers Ġit Ġinto Ġthis Ġmap Ġunless Ġnull . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠThe Ġattribute 's Ġname . ĊĠĠĠĠ Ġ* Ġ@ param Ġfunc ĠThe Ġmapping Ġfunction . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġin Ġthe Ġcurrent Ġcoroutine Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġcompute If Absent ( name : ĠString , Ġcross inline Ġfunc : Ġ( String ) Ġ-> ĠT ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Attributes ()?. compute If Absent ( name ) Ġ{ Ġfunc ( it ) Ġ} Ġas ĠT ? ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠCor outine Scope . inherit able Async ( ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠ Ġattributes : ĠMutable Map < String , ĠAny >? Ġ= Ġnull , ĊĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠ Ġcross inline Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT Ċ ): ĠDeferred < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis . async ( context Ġ+ ĠCor outine Local Context . inherit Parent Element ( attributes ), Ġstart ) Ġ{ Ġblock ( this ) Ġ} Ċ } Ċ Ċ inline Ġfun ĠCor outine Scope . inherit able Launch ( ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠ Ġattributes : ĠMutable Map < String , ĠAny >? Ġ= Ġnull , ĊĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠ Ġcross inline Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġthis . launch ( context Ġ+ ĠCor outine Local Context . inherit Parent Element ( attributes ), Ġstart ) Ġ{ Ġblock ( this ) Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠStarts Ġan Ġasynchronous Ġtask Ġwaiting Ġthe Ġresult Ġand Ġinherits Ġparent Ġcoroutine Ġlocal Ġattributes . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcontext ĠAdditional Ġto Ġ[ Coroutine Scope . coroutine Context ] Ġcontext Ġof Ġthe Ġcoroutine . Ċ Ġ* Ġ@ param Ġattributes ĠThe Ġattributes Ġmerge Ġinto Ġthe Ġparent Ġcoroutine Ġcontext Ġelement . Ċ Ġ* Ġ@ param Ġblock ĠThe Ġcoroutine Ġcode Ġblock . Ċ Ġ* Ġ@ return ĠThe Ġresult . Ċ Ġ*/ Ċ suspend Ġinline Ġfun Ġ< T > Ġwith Context Inherit able ( ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠ Ġattributes : ĠMutable Map < String , ĠAny >? Ġ= Ġnull , ĊĠĠĠ Ġcross inline Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT Ċ ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġwith Context ( context Ġ+ ĠCor outine Local Context . inherit Parent Element ( attributes )) Ġ{ Ġblock ( this ) Ġ} Ċ }