package Ġen chant . magic Ċ Ċ /** Ġ[ Status ] Ġis Ġa Ġgeneral - purpose Ġconstruct Ġthat Ġis Ġmeant Ġto Ġtrack Ġthe Ġprogress Ġof Ġany Ġgiven Ġtask . Ġ*/ Ċ sealed Ġclass ĠStatus ( val Ġtype : ĠStatus Type ) Ġ{ ĊĊĠĠĠ Ġ/** ĠRepresents Ġwhen Ġan Ġoperation Ġhas Ġnot Ġbegan , Ġand Ġis Ġawait ing Ġaction Ġto Ġbegin Ġ*/ ĊĠĠĠ Ġclass ĠNot Started Ġ: ĠStatus ( StatusType . Not Started ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Not Started " ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġother Ġis Ġen chant . magic . Not Started ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRepresents Ġa Ġloading Ġstate , Ġwhen Ġthe Ġoperation Ġis Ġcurrently Ġstill Ġgoing Ġon Ġand Ġactive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprogress ĠThe Ġprogress Ġof Ġthe Ġoperation Ġas Ġa Ġpercentage Ġbetween Ġ[ 0 . 0 , Ġ 1 . 0 ]. ĠDefaults Ġto ĊĠĠĠĠ Ġ* Ġ- 1 Ġif Ġshowing Ġ[ progress ] Ġisn 't Ġsupported . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠLoading ( override Ġval Ġprogress : ĠFloat Ġ= Ġ- 1 f ) Ġ: ĠStatus ( StatusType . Loading ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresents Ġa Ġsuccessful Ġstate , Ġwhen Ġthe Ġoperation Ġhas Ġcompleted Ġwith Ġthe Ġexpected Ġoutcome ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠSuccess Ġ: ĠStatus ( StatusType . Success ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Success " ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġother Ġis Ġen chant . magic . Success ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresents Ġan Ġerror Ġstate , Ġwhen Ġexecuting Ġthe Ġoperation Ġcaused Ġan Ġerror Ġto Ġoccur ĊĠĠĠĠ Ġ* Ġ@ param Ġcode ĠAn Ġerror Ġcode Ġassociated Ġwith Ġthe Ġencountered Ġerror . ĠDefaults Ġto Ġ- 1 Ġif Ġerror ĊĠĠĠĠ Ġ* Ġcodes Ġaren 't Ġsupported . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠIssue ( override Ġval Ġmessage : ĠString Ġ= Ġ"", Ġoverride Ġval Ġcode : ĠInt Ġ= Ġ- 1 ) Ġ: ĊĠĠĠĠĠĠĠ ĠStatus ( StatusType . Issue ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Loading . progress ] Ġif Ġthe Ġcurrent Ġstatus Ġis Ġ[ Loading ], Ġcrashes Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġval Ġprogress : ĠFloat Ġget () Ġ= Ġ( this Ġas ĠLoading ). progress ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Issue . message ] Ġif Ġthe Ġcurrent Ġstatus Ġis Ġ[ Issue ], Ġcrashes Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġval Ġmessage : ĠString Ġget () Ġ= Ġ( this Ġas ĠIssue ). message ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Issue . code ] Ġif Ġthe Ġcurrent Ġstatus Ġis Ġ[ Issue ], Ġcrashes Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġval Ġcode : ĠInt Ġget () Ġ= Ġ( this Ġas ĠIssue ). code Ċ } Ċ Ċ /** ĠIdentifier Ġso ĠKotlin / Native Ġconsumers Ġcan Ġread Ġthe Ġtype Ġof Ġdifferent Ġ[ Status ] es */ Ċ enum Ġclass ĠStatus Type Ġ{ ĠNot Started , ĠLoading , ĠSuccess , ĠIssue Ġ} Ċ Ċ /** Ġ@ see ĠStatus . Not Started */ Ċ type alias ĠNot Started Ġ= ĠStatus . Not Started Ċ Ċ /** Ġ@ see ĠStatus . Loading */ Ċ type alias ĠLoading Ġ= ĠStatus . Loading Ċ Ċ /** Ġ@ see ĠStatus . Success */ Ċ type alias ĠSuccess Ġ= ĠStatus . Success Ċ Ċ /** Ġ@ see ĠStatus . Issue */ Ċ type alias ĠIssue Ġ= ĠStatus . Issue Ċ Ċ /** ĠAn Ġexception Ġthat Ġis Ġcar ries Ġan Ġ[ Issue ] Ġand Ġis Ġexpected Ġto Ġbe Ġcaught Ġwithin Ġa Ġ[ Status ViewModel . status ] Ċ Ġ* Ġor Ġ[ Status ViewModel . single Status ] Ġso Ġthe Ġissue Ġcan Ġbe Ġstored Ġin Ġa ĠViewModel Ġstatus Ġ*/ Ċ class ĠIssue Exception ( val Ġissue : ĠStatus . Issue ) Ġ: ĊĠĠĠ ĠException (" Issue Ġexception Ġwith Ġ$ issue Ġis Ġmeant Ġto Ġbe Ġcaught Ġwithin Ġa ĠStatus ViewModel ") Ċ Ċ /** ĠThrows Ġan Ġ[ Issue ] Ġthat Ġis Ġexpected Ġto Ġbe Ġcaught Ġby Ġ[ Status ViewModel . status ] Ġor Ċ Ġ* Ġ[ Status ViewModel . single Status ]. ĠThis Ġcan Ġbe Ġcalled Ġfrom Ġanywhere , Ġbut Ġthe Ġcall Ġchain Ġshould Ċ Ġ* Ġalways Ġri se Ġup Ġto Ġa ĠViewModel Ġstatus Ġbuilder . Ċ Ġ* Ġ@ param Ġmessage ĠThe Ġerror Ġmessage Ġof Ġthe Ġcaused Ġissue Ċ Ġ* Ġ@ param Ġcode ĠThe Ġerror Ġcode Ġof Ġthe Ġcaused Ġissue Ġ*/ Ċ fun Ġissue ( message : ĠString Ġ= Ġ"", Ġcode : ĠInt Ġ= Ġ- 1 ): ĠNothing Ġ= ĊĠĠĠ Ġthrow ĠIssue Exception ( Issue ( message , Ġcode ))