package Ġcom . le es uch an . shared . model Ċ Ċ sealed Ġclass ĠResult < out ĠR > Ġ{ ĊĊĠĠĠ Ġobject ĠLoading Ġ: ĠResult < Nothing >() ĊĊĠĠĠ Ġdata Ġclass ĠSuccess < out ĠT >( val Ġdata : ĠT ) Ġ: ĠResult < T >() ĊĊĠĠĠ Ġdata Ġclass ĠFailure ( val Ġexception : ĠThrowable ) Ġ: ĠResult < Nothing >() ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLoading Ġ-> Ġ" Loading " ĊĠĠĠĠĠĠĠ Ġis ĠSuccess < *> Ġ-> Ġ" Success [ data =$ data ]" ĊĠĠĠĠĠĠĠ Ġis ĠFailure Ġ-> Ġ" Failure [ exception =$ exception ]" ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠResult <* >. is Success Ġget () Ġ= Ġthis Ġis ĠResult . Success Ġ&& Ġdata Ġ!= Ġnull Ċ Ċ val ĠResult <* >. is Failure Ġget () Ġ= Ġ! is Success Ċ Ċ fun Ġ< T > ĠResult < T >. get OrNull (): ĠT ? Ġ= Ġ( this Ġas ? ĠResult . Success < T >) ?. data Ċ Ċ fun Ġ< T > ĠResult < T >. get OrDefault ( default : ĠT ): ĠT Ġ= Ġ( this Ġas ? ĠResult . Success < T >) ?. data Ġ?: Ġdefault Ċ Ċ fun Ġ< T > ĠResult < T >. get OrThrow (): ĠT Ġ{ ĊĠĠĠ Ġthrow On Failure () ĊĠĠĠ Ġreturn Ġ( this Ġas ĠResult . Success < T >). data Ċ } Ċ Ċ fun ĠResult <* >. throw On Failure () Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠResult . Failure ) Ġthrow Ġexception Ċ } Ċ Ċ fun ĠResult <* >. get Exception OrNull (): ĠThrowable ? Ġ= Ġ( this Ġas ? ĠResult . Failure )?. exception Ċ Ċ fun Ġ< T > ĠResult < T >. handle ( ĊĠĠĠ Ġloading Block : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġsuccess Block : Ġ(( T ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġfailure Block : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġfinally Block : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠResult . Loading Ġ-> Ġloading Block ?. invoke () ĊĠĠĠĠĠĠĠ Ġis ĠResult . Success Ġ-> Ġsuccess Block ?. invoke ( data ) ĊĠĠĠĠĠĠĠ Ġis ĠResult . Failure Ġ-> Ġfailure Block ?. invoke ( exception ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfinally Block ?. invoke () Ċ } Ċ