package Ġcom . ens ody . reactiv est ate Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Coroutine Start Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġlaunch ing Ġcor outines Ġwith Ġerror Ġhandling Ġand Ġloading Ġstate Ġtracking . Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġtrack Ġmultiple Ġdifferent Ġkinds Ġof Ġloading Ġstates Ġby Ġdefining Ġseparate Ġ[ Mutable Value Flow ]. Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ Reactive State ] Ġfor Ġa Ġfull Ġimplementation Ġthat Ġyou 'll Ġusually Ġwant Ġto Ġuse . Ċ Ġ*/ Ċ public Ġinterface ĠCor outine Launcher Ġ{ ĊĠĠĠ Ġ/** ĠThe Ġunderlying Ġ[ Coroutine Scope ] Ġof Ġthis Ġlauncher . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġlauncher Scope : ĠCor outine Scope ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġloading Ġtracker . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġ[ increment ]/ [ decrement ] Ġto Ġsafely Ġupdate Ġthe Ġloading Ġcounter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġloading : ĠMutable Value Flow < Int > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLa unches Ġa Ġcoroutine Ġwithout Ġany Ġerror Ġhandling Ġor Ġloading Ġstate Ġtracking . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġadditional Ġto Ġ[ Coroutine Scope . coroutine Context ] Ġcontext Ġof Ġthe Ġcoroutine . ĊĠĠĠĠ Ġ* Ġ@ param Ġstart Ġcoroutine Ġstart Ġoption . ĠThe Ġdefault Ġvalue Ġis Ġ[ Coroutine Start . DEFAULT ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode Ġwhich Ġwill Ġbe Ġinvoked Ġin Ġthe Ġcontext Ġof Ġthe Ġprovided Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġraw Launch ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠCor outine Context , ĊĠĠĠĠĠĠĠ Ġstart : ĠCor outine Start , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit , ĊĠĠĠ Ġ): ĠJob Ġ= ĊĠĠĠĠĠĠĠ Ġlauncher Scope . launch ( context Ġ= Ġcontext , Ġstart Ġ= Ġstart , Ġblock Ġ= Ġblock ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLa unches Ġa Ġcoroutine . ĠMark Ġlong - running Ġcor outines Ġby Ġsetting Ġ[ with Loading ] Ġto Ġloading Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġadditional Ġto Ġ[ Coroutine Scope . coroutine Context ] Ġcontext Ġof Ġthe Ġcoroutine . ĊĠĠĠĠ Ġ* Ġ@ param Ġstart Ġcoroutine Ġstart Ġoption . ĠThe Ġdefault Ġvalue Ġis Ġ[ Coroutine Start . DEFAULT ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġwith Loading ĠTrack s Ġloading Ġstate Ġfor Ġthe Ġ( re -) computation . ĠDefaults Ġto Ġ[ loading ]. ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThis Ġshould Ġbe Ġ` null ` Ġfor Ġlong - running Ġ/ Ġnever - termin ating Ġcor outines Ġ( e . g . Ġ` flow . collect `). ĊĠĠĠĠ Ġ* Ġ@ param ĠonError ĠOptional Ġcustom Ġerror Ġhandler . ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode Ġwhich Ġwill Ġbe Ġinvoked Ġin Ġthe Ġcontext Ġof Ġthe Ġprovided Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġlaunch ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠĠĠĠĠ Ġwith Loading : ĠMutable Value Flow < Int >? Ġ= Ġloading , ĊĠĠĠĠĠĠĠ ĠonError : Ġ( suspend Ġ( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit , ĊĠĠĠ Ġ): ĠJob Ġ= ĊĠĠĠĠĠĠĠ Ġraw Launch ( context Ġ= Ġcontext , Ġstart Ġ= Ġstart ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack ( with Loading Ġ= Ġwith Loading , ĠonError Ġ= ĠonError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrack s Ġa Ġsus pension Ġ[ block ]' s Ġloading Ġstate Ġand Ġerrors . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMark Ġlong - running Ġcor outines Ġby Ġsetting Ġ[ with Loading ] Ġto Ġloading Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwith Loading ĠTrack s Ġloading Ġstate Ġfor Ġthe Ġ( re -) computation . ĠDefaults Ġto Ġ[ loading ]. ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThis Ġshould Ġbe Ġ` null ` Ġfor Ġlong - running Ġ/ Ġnever - termin ating Ġcor outines Ġ( e . g . Ġ` flow . collect `). ĊĠĠĠĠ Ġ* Ġ@ param ĠonError ĠOptional Ġcustom Ġerror Ġhandler . ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode Ġwhich Ġwill Ġbe Ġinvoked Ġin Ġthe Ġcontext Ġof Ġthe Ġprovided Ġscope . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġtrack ( ĊĠĠĠĠĠĠĠ Ġwith Loading : ĠMutable Value Flow < Int >? Ġ= Ġloading , ĊĠĠĠĠĠĠĠ ĠonError : Ġ( suspend Ġ( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Error Reporting ({ ĠonError ?. invoke ( it ) Ġ?: ĠonError ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Loading ?. increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Loading ?. decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġerror ĊĠĠĠ Ġ} Ċ } Ċ