package Ġcom . github . pro log db . async Ċ Ċ import Ġjava . util . concurrent . Cancellation Exception Ċ import Ġjava . util . concurrent . Future Ċ import Ġkotlin . coroutines . Restrict s Sus pension Ċ Ċ /** Ċ Ġ* ĠRe semb les Ġthe Ġwork Ġneeded Ġto Ġcompute Ġa Ġresult Ġwhich Ġis Ġsplit Ġinto Ġmultiple Ċ Ġ* Ġsteps Ġeach Ġseparated Ġby Ġa Ġcoroutine Ġsus pension . ĠThe Ġ[ step ] Ġfunction Ġcan Ġbe Ċ Ġ* Ġcalled Ġrepeatedly Ġuntil Ġa Ġresult Ġis Ġpresent Ġor Ġa Ġerror Ġcondition Ġar ises . Ċ Ġ*/ Ċ interface ĠWork able Future < T > Ġ: ĠFuture < T > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġconcurrency Ġprincipal . ĠInstead Ġof Ġ[ Thread ], Ġthis Ġis Ġused Ġto Ġobtain Ġlocks Ġand Ġmutex es Ġin Ġthe ĊĠĠĠĠ Ġ* Ġname Ġof Ġthe Ġcoroutine . ĠTr ad itional Ġ[ synchronized ] Ġblocks Ġare Ġstill Ġused Ġto Ġprevent Ġmultiple Ġthreads ĊĠĠĠĠ Ġ* Ġfrom Ġrunning Ġthe Ġsame Ġcoroutine Ġsimultaneously . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġprincipal : ĠPrincipal ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms ĠCPU & memory Ġbound Ġwork Ġon Ġthis Ġtask Ġreturns Ġwhen Ġwaiting Ġfor ĊĠĠĠĠ Ġ* ĠI / O Ġbound Ġtasks Ġ( disk , Ġmemory , Ġ... ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġresult Ġis Ġalready Ġpresent , Ġdoes Ġnothing Ġand Ġreturns Ġ` true `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġcan Ġonly Ġbe Ġrun Ġby Ġone Ġthread Ġat Ġa Ġtime . ĊĠĠĠĠ Ġ* ĠImplement ations Ġare Ġincl ined Ġto Ġuse Ġ[ synchronized ] Ġto Ġachieve ĊĠĠĠĠ Ġ* Ġthis Ġbehaviour , Ġ[ java . util . concurrent . locks . Lock ] s Ġare Ġanother ĊĠĠĠĠ Ġ* Ġoption , Ġthough . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġwhether Ġthe Ġresult Ġis Ġavailable Ġafter Ġthis Ġcall ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstep (): ĠBoolean Ċ } Ċ Ċ @ Restrict s Sus pension Ċ interface ĠWork able Future Builder Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġprincipal Ġthis Ġfuture Ġis Ġrunning Ġas . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġprincipal : ĠPrincipal ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS usp ends Ġthis Ġcoroutine Ġuntil Ġthe Ġgiven Ġfuture Ġis Ġpresent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġgiven Ġfuture Ġis Ġalready Ġdone Ġor Ġcancelled , Ġreturns / throws ĊĠĠĠĠ Ġ* Ġimmediately Ġwithout Ġsus pending Ġthe Ġcoroutine . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġfutures Ġvalue ĊĠĠĠĠ Ġ* Ġ@ throws ĠException ĠFor warded Ġfrom Ġthe Ġ[ Future ], Ġincluding Ġ[ Cancellation Exception ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠPrincipal Conflict Exception ĠIf Ġthe Ġgiven Ġfuture Ġis Ġa Ġ[ Work able Future ] Ġand Ġhas Ġa Ġdifferent Ġ[ principal ] ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthan Ġthis Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġ< E > Ġawait ( future : ĠFuture < E >): ĠE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSame Ġas Ġ[ await ( Future )] Ġbut Ġcalls Ġ[ finally ] Ġfirst . ĠThis Ġis Ġeffectively Ġsyntax Ġs ugar ĊĠĠĠĠ Ġ* Ġso Ġthat Ġthe Ġfinally Ġcode Ġappears Ġin Ġthe Ġorder Ġit Ġactually Ġruns . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTurn s ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġfuture Ġ= Ġstart Process () ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfinally Ġ{ Ġclean Up (); Ġ} ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġresult Ġ= Ġawait ( future ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġinto ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġresult Ġ= Ġawait And Finally ( start Process ()) Ġ{ Ġclean Up () Ġ} ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġ< E > Ġawait And Finally ( future : ĠFuture < E >, Ġfinally : Ġ() Ġ-> ĠAny ?): ĠE Ġ{ ĊĠĠĠĠĠĠĠ Ġfinally ( finally ) ĊĠĠĠĠĠĠĠ Ġreturn Ġawait ( future ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġgiven Ġcode Ġwill Ġrun Ġbefore Ġthis Ġfuture Ġcompletes Ġ( Also Ġwhen Ġcancelled ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġthis Ġfunction Ġis Ġcalled Ġmultiple Ġtimes Ġthe Ġdifferent Ġfunctions Ġwill ĊĠĠĠĠ Ġ* Ġbe Ġexecuted Ġin Ġreverse Ġorder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfinally ( code : Ġ() Ġ-> ĠAny ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLog ically Ġlike Ġ[ Lazy Sequence . fold Remaining ] Ġwith Ġthese Ġdifferences Ġin ĊĠĠĠĠ Ġ* Ġtechnical Ġbehaviour : ĊĠĠĠĠ Ġ* Ġ* Ġif Ġthis Ġfuture Ġis Ġcancelled , Ġthe Ġsequence Ġis Ġclosed . ĊĠĠĠĠ Ġ* Ġ* Ġcalls Ġto Ġ[ Work able Future . step ] Ġare Ġdeferred Ġto Ġthe Ġsequence ĊĠĠĠĠ Ġ* Ġ@ throws ĠPrincipal Conflict Exception ĠIf Ġthe Ġgiven Ġsequence Ġbelongs Ġto Ġanother Ġprincipal . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġ< Element , ĠC arry > Ġfold Remaining ( sequence : ĠLazy Sequence < Element >, Ġinitial : ĠC arry , Ġaccumulator : Ġ( C arry , ĠElement ) Ġ-> ĠC arry ): ĠC arry Ċ } Ċ Ċ fun Ġ< T > Ġlaunch Work able Future ( principal : ĠAny , Ġcode : Ġsuspend ĠWork able Future Builder . () Ġ-> ĠT ): ĠWork able Future < T > Ġ= ĠWork able Future Impl ( principal , Ġcode ) Ċ