package Ġcom . d oo ol . core Ċ Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġcom . d oo ol . poke dex . domain . Load State Ċ import Ġcom . d oo ol . poke dex . domain . getData Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . combine Ċ import Ġkotlinx . coroutines . flow . flatMap Latest Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . scan Ċ Ċ @ Composable Ċ fun Ġ< T Ġ: ĠAny > ĠLoad State < T >. Process ( ĊĠĠĠ ĠonError : Ġ@ Composable Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġon Loading : Ġ@ Composable Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ ĠonComplete : Ġ@ Composable Ġ( T ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Success Ġ-> ĠonComplete ( data ) ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Error Ġ-> ĠonError () ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Loading Ġ-> Ġon Loading () ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġ< T , ĠR > ĠLoad State < T >. map Data ( ĊĠĠĠ Ġprevious : ĠLoad State < R >? Ġ= Ġnull , ĊĠĠĠ Ġblock : Ġsuspend Ġ( T ) Ġ-> ĠR Ċ ): ĠLoad State < R > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Error Ġ-> ĠLoad State . failure ( e ) ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Loading Ġ-> ĠLoad State . loading ( previous ?. getData ()) ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Success Ġ-> ĠLoad State . success ( block ( data )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T , ĠR > ĠFlow < Load State < T >> . map Data ( previous : ĠLoad State < R >? Ġ= Ġnull , Ġblock : Ġsuspend Ġ( T ) Ġ-> ĠR ) Ġ= ĊĠĠĠ Ġmap Ġ{ Ġit . map Data ( previous , Ġblock ) Ġ} Ċ Ċ fun Ġ< T , ĠR > ĠFlow < Load State < T >> . flatMap Latest State ( ĊĠĠĠ Ġblock : Ġsuspend Ġ( T ) Ġ-> ĠFlow < Load State < R >> Ċ ): ĠFlow < Load State < R >> Ġ= Ġflat Map Latest Ġ{ ĊĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Error Ġ-> Ġflow Of ( Load State . failure ( it . e )) ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Loading Ġ-> Ġflow Of ( Load State . loading ()) ĊĠĠĠĠĠĠĠ Ġis ĠLoad State . Success Ġ-> Ġblock ( it . data ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T , ĠR > ĠFlow < Load State < T >> . scan Load State ( block : Ġsuspend Ġ( T ) Ġ-> ĠR ) Ġ= ĊĠĠĠ Ġscan ( Load State . loading < R >()) Ġ{ Ġstate , Ġdata Ġ-> ĊĠĠĠĠĠĠĠ Ġdata . map Data ( state ) Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun Ġ< T 1 , ĠT 2 > Ġcombine Load State ( ĊĠĠĠ Ġflow : ĠFlow < Load State < T 1 >>, ĊĠĠĠ Ġflow 2 : ĠFlow < Load State < T 2 >> Ċ ): ĠFlow < Load State < Pair < T 1 , ĠT 2 >>> Ġ= Ġcombine ( flow , Ġflow 2 ) Ġ{ Ġdata 1 , Ġdata 2 Ġ-> ĊĠĠĠ Ġif Ġ( data 1 Ġis ĠLoad State . Success Ġ&& Ġdata 2 Ġis ĠLoad State . Success ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLoad State . success ( Pair ( data 1 . data , Ġdata 2 . data )) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( data 1 Ġis ĠLoad State . Error Ġ|| Ġdata 2 Ġis ĠLoad State . Error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġ( data 1 Ġas ? ĠLoad State . Error )?. e Ġ?: Ġ( data 2 Ġas ? ĠLoad State . Error )?. e ĊĠĠĠĠĠĠĠ ĠLoad State . failure ( error ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠLoad State . loading () ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > Ġcombine Load State ( ĊĠĠĠ Ġflows : ĠIterable < Flow < Load State < T >>> Ċ ): ĠFlow < Load State < List < T >>> Ġ= Ġcombine ( flows ) Ġ{ ĊĠĠĠ Ġval Ġsuccess List Ġ= Ġit . filter Is Instance < Load State . Success < T >>() ĊĠĠĠ Ġif Ġ( it . size Ġ== Ġsuccess List . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ combine ĠLoad State . success ( success List . map Ġ{ Ġit . data Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠhasError Ġ= Ġit . filter Is Instance < Load State . Error < T >>() ĊĠĠĠ Ġif Ġ( has Error . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ combine ĠLoad State . failure ( has Error . first (). e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn @ combine ĠLoad State . loading () Ċ } Ċ