package Ġme . a art ik ov . ses ame . loading . simple Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . flow .* Ċ Ċ /** Ċ Ġ* ĠHel ps Ġto Ġload Ġdata Ġand Ġmanage Ġloading Ġstate . Ċ Ġ*/ Ċ interface ĠLoading < T Ġ: ĠAny > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoading Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsealed Ġclass ĠState < out ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠEmpty Ġdata Ġhas Ġbeen Ġloaded Ġor Ġloading Ġis Ġnot Ġstarted Ġyet . ĠData Ġis Ġempty Ġif Ġit Ġis Ġnull Ġor Ġ[ isEmpty ] Ġreturns Ġtrue Ġfor Ġit . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġobject ĠEmpty Ġ: ĠState < Nothing >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoading Ġis Ġin Ġprogress Ġand Ġthere Ġis Ġno Ġpreviously Ġloaded Ġdata . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġobject ĠLoading Ġ: ĠState < Nothing >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoading Ġerror Ġhas Ġoccurred Ġand Ġthere Ġis Ġno Ġpreviously Ġloaded Ġdata . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠError ( val Ġthrowable : ĠThrowable ) Ġ: ĠState < Nothing >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNon - empty Ġdata Ġhas Ġbeen Ġloaded . Ġ[ refresh ing ] Ġis Ġtrue Ġwhen Ġsecond Ġloading Ġis Ġin Ġprogress . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠData < T >( val Ġdata : ĠT , Ġval Ġrefresh ing : ĠBoolean Ġ= Ġfalse ) Ġ: ĠState < T >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoading Ġevent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsealed Ġclass ĠEvent < out ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAn Ġerror Ġoccurred . Ġ[ state During Loading ] Ġa Ġstate Ġthat Ġwas Ġduring Ġthe Ġfailed Ġloading . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠError < T >( val Ġthrowable : ĠThrowable , Ġval Ġstate During Loading : ĠState < T >) Ġ: ĠEvent < T >() Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIs Ġtrue Ġwhen Ġthere Ġis Ġpreviously Ġloaded Ġdata . ĠIt Ġis Ġuseful Ġto Ġnot Ġshow Ġan Ġerror Ġdialog Ġwhen Ġa Ġfullscreen Ġerror Ġis Ġalready Ġshown . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Data Ġget () Ġ= Ġstate During Loading Ġis ĠState . Data ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlow Ġof Ġloading Ġstates . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstate Flow : ĠState Flow < State < T >> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlow Ġof Ġloading Ġevents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġevent Flow : ĠFlow < Event < T >> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġto Ġload Ġdata . ĊĠĠĠĠ Ġ* Ġ@ param Ġfresh Ġindicates Ġthat Ġfresh Ġdata Ġis Ġrequired . ĠSee Ġ[ Ord inary Loader . load ] Ġand Ġ[ Flow Loader . load ] ĊĠĠĠĠ Ġ* Ġ@ param Ġreset Ġif Ġtrue Ġthan Ġpreviously Ġloaded Ġdata Ġwill Ġbe Ġinstant ly Ġdropped Ġand Ġin Ġprogress Ġloading Ġwill Ġbe Ġcanceled . ĊĠĠĠĠ Ġ* ĠIf Ġfalse Ġthan Ġpreviously Ġloaded Ġdata Ġwill Ġbe Ġpreserved Ġuntil Ġsuccessful Ġoutcome Ġand Ġa Ġloading Ġrequest Ġwill Ġbe Ġignored Ġif Ġanother Ġone Ġis Ġalready Ġin Ġprogress . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġload ( fresh : ĠBoolean , Ġreset : ĠBoolean Ġ= Ġfalse ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġto Ġcancel Ġin Ġprogress Ġloading . ĊĠĠĠĠ Ġ* Ġ@ param Ġreset Ġif Ġtrue Ġthan Ġstate Ġwill Ġbe Ġreset Ġto Ġ[ Loading . State . Empty ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcancel ( reset : ĠBoolean Ġ= Ġfalse ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMut ates Ġ[ Loading . State . Data . data ] Ġwith Ġa Ġ[ transform ] Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmutate Data ( transform : Ġ( T ) Ġ-> ĠT ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġshortcut Ġfor Ġload ( fresh Ġ= Ġtrue , Ġreset Ġ= Ġfalse ). ĠRequests Ġto Ġload Ġfresh Ġdata Ġand Ġpreserve Ġthe Ġold Ġone Ġuntil Ġsuccessful Ġoutcome . Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠLoading < T >. refresh () Ġ= Ġload ( fresh Ġ= Ġtrue , Ġreset Ġ= Ġfalse ) Ċ Ċ /** Ċ Ġ* ĠA Ġshortcut Ġfor Ġload ( fresh , Ġreset Ġ= Ġtrue ). ĠRequests Ġto Ġdrop Ġold Ġdata Ġand Ġload Ġnew Ġone . Ċ Ġ* Ġ@ param Ġfresh Ġindicates Ġthat Ġfresh Ġdata Ġis Ġrequired . ĠSee Ġ[ Ord inary Loader . load ] Ġand Ġ[ Flow Loader . load ]. Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠLoading < T >. restart ( fresh : ĠBoolean Ġ= Ġtrue ) Ġ= Ġload ( fresh , Ġreset Ġ= Ġtrue ) Ċ Ċ /** Ċ Ġ* ĠA Ġshortcut Ġfor Ġcancel ( reset Ġ= Ġtrue ). ĠCancel s Ġloading Ġand Ġsets Ġstate Ġto Ġ[ Loading . State . Empty ]. Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠLoading < T >. reset () Ġ= Ġcancel ( reset Ġ= Ġtrue ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġcurrent Ġ[ Loading . State ]. Ċ Ġ*/ Ċ val Ġ< T Ġ: ĠAny > ĠLoading < T >. state : ĠLoading . State < T > Ġget () Ġ= Ġstate Flow . value Ċ Ċ /** Ċ Ġ* ĠReturns Ġ[ Loading . State . Data . data ] Ġif Ġit Ġis Ġavailable Ġor Ġnull Ġotherwise Ċ Ġ*/ Ċ val Ġ< T Ġ: ĠAny > ĠLoading < T >. data OrNull : ĠT ? Ġget () Ġ= Ġstate . data OrNull Ċ Ċ /** Ċ Ġ* ĠReturns Ġ[ Loading . State . Error . throwable ] Ġif Ġit Ġis Ġavailable Ġor Ġnull Ġotherwise Ċ Ġ*/ Ċ val ĠLoading <* >. error OrNull : ĠThrowable ? Ġget () Ġ= Ġstate . error OrNull Ċ Ċ /** Ċ Ġ* ĠReturns Ġ[ Loading . State . Data . data ] Ġif Ġit Ġis Ġavailable Ġor Ġnull Ġotherwise Ċ Ġ*/ Ċ val Ġ< T Ġ: ĠAny > ĠLoading . State < T >. data OrNull : ĠT ? Ġget () Ġ= Ġ( this Ġas ? ĠLoading . State . Data )?. data Ċ Ċ /** Ċ Ġ* ĠReturns Ġ[ Loading . State . Error . throwable ] Ġif Ġit Ġis Ġavailable Ġor Ġnull Ġotherwise Ċ Ġ*/ Ċ val ĠLoading . State <* >. error OrNull : ĠThrowable ? Ġget () Ġ= Ġ( this Ġas ? ĠLoading . State . Error )?. throwable Ċ Ċ /** Ċ Ġ* ĠA Ġhelper Ġmethod Ġto Ġhandle Ġ[ Loading . Event . Error ]. Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny > ĠLoading < T >. handle Errors ( ĊĠĠĠ Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġhandler : Ġ( Loading . Event . Error < T >) Ġ-> ĠUnit Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġreturn Ġevent Flow . filter Is Instance < Loading . Event . Error < T >>() ĊĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. launch In ( scope ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġnew Ġ[ Loading . State ] Ġof Ġapplying Ġthe Ġgiven Ġ[ transform ] Ġfunction Ġto Ġoriginal Ġ[ Loading . State . Data . data ]. Ċ Ġ*/ Ċ fun Ġ< T , ĠR > ĠLoading . State < T >. map Data ( transform : Ġ( T ) Ġ-> ĠR ): ĠLoading . State < R > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLoading . State . Empty Ġ-> ĠLoading . State . Empty ĊĠĠĠĠĠĠĠ ĠLoading . State . Loading Ġ-> ĠLoading . State . Loading ĊĠĠĠĠĠĠĠ Ġis ĠLoading . State . Error Ġ-> ĠLoading . State . Error ( throwable ) ĊĠĠĠĠĠĠĠ Ġis ĠLoading . State . Data Ġ-> ĠLoading . State . Data ( transform ( data ), Ġrefresh ing ) ĊĠĠĠ Ġ} Ċ } Ċ