package Ġcom . soft bank robot ics . dx . pep per extras . util Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . al de bar an . qi . Future Ċ import Ġcom . al de bar an . qi . Promise Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . security . Secure Random Ċ import Ġjava . util . concurrent . Cancellation Exception Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ Ċ /* Ċ How Ġcor outines Ġworks : ĊĠ Ġ- ĠCor outine Scope Ġvs ĠCor outine Context ĊĠĠĠ Ġhttps :// medium . com /@ el izar ov / coroutine - context - and - scope - c 8 b 2 5 5 d 5 9 0 5 5 ĊĠ Ġ- Ġhttps :// medium . com / sw lh / everything - you - need - to - know - about - kotlin - coroutines - b 3 d 9 4 f 2 bc 9 8 2 Ċ Ġ*/ Ċ Ċ object ĠSingle Thread Ġ{ ĊĠĠĠ Ġval ĠDispatcher Ġ= ĠExec utors . new Single Thread Executor Ġ{ ĊĠĠĠĠĠĠĠ ĠThread ( it , Ġ" Pep per Extras Single Thread ") ĊĠĠĠ Ġ}. as Coroutine Dispatcher () ĊĊĠĠĠ Ġ// ĠSingleton Ġscope Ġthat Ġdo Ġdoes Ġnot Ġkill Ġall Ġits Ġchildren . ĊĠĠĠ Ġval ĠGlobal Scope Ġ= ĠCor outine Scope ( Supervisor Job () Ġ+ ĠDispatcher ) ĊĊĠĠĠ Ġ// ĠConstruct Ġa Ġnew ĠCor outine Scope Ġthat Ġk ills Ġits Ġchildren ĊĠĠĠ Ġfun Ġnew Coroutine Scope (): ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatcher ) Ċ } ĊĊ Ċ private Ġval Ġchar Pool Ġ: ĠList < Char > Ġ= Ġ(' a ' .. ' z ') Ġ+ Ġ(' A ' .. ' Z ') Ġ+ Ġ(' 0 ' .. ' 9 ') Ċ private Ġconst Ġval ĠSTRING _ LENGTH Ġ= Ġ 6 Ċ private Ġfun ĠgetRandom String (): ĠString Ġ{ ĊĠĠĠ Ġval Ġrandom Ġ= ĠSecure Random () ĊĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( STRING _ LENGTH ) ĊĠĠĠ Ġrandom . next Bytes ( bytes ) ĊĠĠĠ Ġreturn Ġ( bytes . indices ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Pool [ random . nextInt ( char Pool . size )] ĊĠĠĠĠĠĠĠ Ġ}. join ToString ("") Ċ } Ċ Ċ internal Ġval ĠLazy Coroutine Future To Deferred Map Ġ= Ġmutable Map Of < Future <* >, ĠDeferred <* >>() Ċ Ċ fun Ġ< T > ĠCor outine Scope . async Future ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ): ĠFuture < T > Ġ{ ĊĠĠĠ Ġvar Ġname Ġ= Ġ"" ĊĠĠĠ Ġval Ġpromise Ġ= ĠPromise < T >() ĊĠĠĠ Ġval Ġfuture Ġ= Ġpromise . future ĊĠĠĠ Ġval Ġdeferred Ġ= Ġasync ( context , Ġstart ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġcoroutine Context [ Coroutine Name . Key ]?. name Ġ?: ĠgetRandom String () ĊĠĠĠĠĠĠĠ ĠLog . d (" async Future ", Ġ" Coroutine (\" ${ name }\ ") Ġstarted .") ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcoroutine Scope ( block ) ĊĠĠĠĠĠĠĠ ĠLog . d (" async Future ", Ġ" Coroutine (\" ${ name }\ ") Ġended Ġvalue : Ġ$ value ") ĊĠĠĠĠĠĠĠ Ġpromise . setValue ( value ) ĊĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke On Completion Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLazy Coroutine Future To Deferred Map . remove ( future ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" async Future ", Ġ" Coroutine (\" ${ name }\ ") Ġended Ġwith Ġexception : Ġ$ cause ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause Ġis ĠC ancellation Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . set Cancelled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( cause Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause . message Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . setError ( cause . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . setError ( cause . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ. also Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( start Ġ== ĠCor outine Start . LA ZY ) Ġ{ ĠLazy Coroutine Future To Deferred Map [ future ] Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġpromise . setOn Cancel Ġ{ ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" async Future ", Ġ" Coroutine (\" ${ name }\ ") Ġis Ġgetting Ġcancelled Ġsince Ġfuture Ġis Ġcancelled .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfuture Ċ } Ċ