/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġapp . t ivi Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . as LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġapp . t ivi . common . ui . Build Config Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlin . reflect . K Property 1 Ċ Ċ abstract Ġclass ĠRedux ViewModel < S >( ĊĠĠĠ ĠinitialState : ĠS Ċ ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstate Ġ= ĠMutable State Flow ( initialState ) ĊĠĠĠ Ġprivate Ġval Ġstate Mutex Ġ= ĠMutex () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġsnapshot Ġof Ġthe Ġcurrent Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcurrent State (): ĠS Ġ= Ġstate . value ĊĊĠĠĠ Ġval Ġlive Data : ĠLive Data < S > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . as LiveData () ĊĊĠĠĠ Ġprotected Ġsuspend Ġfun Ġ< T > ĠFlow < T >. execute ( reducer : ĠS .( Async < T >) Ġ-> ĠS ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġreducer ( Loading ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" USE LESS _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Ġ{ ĠSuccess ( it ) Ġas ĠAsync < T > Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( this @ Redux ViewModel :: class . java . simple Name , Ġ" Exception Ġduring Ġexecute ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Fail ( e )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĠsetState Ġ{ Ġreducer ( it ) Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< A > Ġselect Ob serve ( prop 1 : ĠK Property 1 < S , ĠA >): ĠLive Data < A > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselect Subscribe ( prop 1 ). as LiveData () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġsubscribe ( block : Ġ( S ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . collect Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< A > Ġselect Subscribe ( prop 1 : ĠK Property 1 < S , ĠA >, Ġblock : Ġ( A ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Subscribe ( prop 1 ). collect Ġ{ Ġblock ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< A > Ġselect Subscribe ( prop 1 : ĠK Property 1 < S , ĠA >): ĠFlow < A > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . map Ġ{ Ġprop 1 . get ( it ) Ġ}. distinct Until Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġsuspend Ġfun ĠsetState ( reducer : ĠS . () Ġ-> ĠS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġreducer ( state . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠCor outine Scope . setState ( reducer : ĠS . () Ġ-> ĠS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġthis @ Redux ViewModel . setState ( reducer ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġsuspend Ġfun Ġwith State ( block : Ġ( S ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( state . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠCor outine Scope . with State ( block : Ġ( S ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġthis @ Redux ViewModel . with State ( block ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ