/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠDen ys ĠN y ky for ov Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . pop al ay . bar nee . domain Ċ Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . transform Latest Ċ Ċ sealed Ġclass ĠResult < out ĠT >( val Ġcomplete : ĠBoolean , Ġval Ġshould Load : ĠBoolean , Ġprivate Ġval Ġvalue : ĠT ?) Ġ{ ĊĠĠĠ Ġopen Ġoperator Ġfun Ġinvoke (): ĠT ? Ġ= Ġvalue Ċ } Ċ Ċ class ĠUn initialized < out ĠT > Ġ: ĠResult < T >( complete Ġ= Ġfalse , Ġshould Load Ġ= Ġtrue , Ġvalue Ġ= Ġnull ) Ċ Ċ data Ġclass ĠLoading < out ĠT >( private Ġval Ġvalue : ĠT ? Ġ= Ġnull ) Ġ: ĠResult < T >( complete Ġ= Ġfalse , Ġshould Load Ġ= Ġfalse , Ġvalue Ġ= Ġvalue ) Ċ Ċ data Ġclass ĠSuccess < out ĠT >( private Ġval Ġvalue : ĠT ) Ġ: ĠResult < T >( complete Ġ= Ġtrue , Ġshould Load Ġ= Ġfalse , Ġvalue Ġ= Ġvalue ) Ġ{ ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġinvoke (): ĠT Ġ= Ġvalue Ċ } Ċ Ċ data Ġclass ĠFail < out ĠT >( val Ġerror : ĠThrowable , Ġprivate Ġval Ġvalue : ĠT ? Ġ= Ġnull ) Ġ: ĊĠĠĠ ĠResult < T >( complete Ġ= Ġtrue , Ġshould Load Ġ= Ġtrue , Ġvalue Ġ= Ġvalue ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠFail <* >) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġother Error Ġ= Ġother . error ĊĠĠĠĠĠĠĠ Ġreturn Ġerror :: class Ġ== Ġother Error :: class Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror . message Ġ== Ġother Error . message Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror . stack Trace ToString () Ġ== Ġother Error . stack Trace ToString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĠarrayOf ( error :: class , Ġerror . message , Ġerror . stack Trace ToString ()). content HashCode () Ċ } Ċ Ċ val Ġ< T Ġ: ĠAny ?> ĠResult < T >. isEmpty ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis () Ġis ĠCollection < *> Ġ-> Ġ( this () Ġas ĠCollection < *> ). isEmpty () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis () Ġ== Ġnull ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< T Ġ: ĠAny ?, ĠR Ġ: ĠAny ?> ĠResult < T >. map ( cross inline Ġtransform : Ġ( value : ĠT ) Ġ-> ĠR ): ĠResult < R > Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUn initialized Ġ-> ĠUn initialized () ĊĠĠĠĠĠĠĠ Ġis ĠLoading Ġ-> ĠLoading () ĊĠĠĠĠĠĠĠ Ġis ĠSuccess Ġ-> ĠSuccess ( transform ( this ())) ĊĠĠĠĠĠĠĠ Ġis ĠFail Ġ-> ĠFail ( error ) ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< T Ġ: ĠAny , ĠR Ġ: ĠAny > ĠFlow < T >. flatMap To Result ( ĊĠĠĠ Ġcross inline Ġtransform : Ġsuspend Ġ( value : ĠT ) Ġ-> ĠFlow < R > Ċ ): ĠFlow < Result < R >> Ġ= Ġtransform Latest Ġ{ Ġvalue Ġ-> ĊĠĠĠ Ġemit ( Loading ()) ĊĠĠĠ Ġtransform ( value ) ĊĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġemit ( Fail < R >( it ) Ġas ĠResult < R >) Ġ} ĊĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġemit ( Success ( it )) Ġ} Ċ }. catch Ġ{ Ġemit ( Fail ( it )) Ġ} Ċ