package Ġcom . ju ang m . presentation . view model Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . ju ang m . domain . action . Action Ċ import Ġcom . ju ang m . domain . result . Result Ċ import Ġcom . ju ang m . presentation . state . ViewState Ċ import Ġtim ber . log . Tim ber Ċ Ċ abstract Ġclass ĠBase ViewModel < S : ĠView State , ĠA : ĠAction , ĠR : ĠResult >( private Ġval Ġinitial ViewState : ĠS ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLive Data Ġwhich Ġholds Ġthe Ġnext Ġaction Ġto Ġdispatch ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġnext Action Ġ= ĠMutable LiveData < A >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLive Data Ġwhich Ġhold Ġthe Ġcurrent Ġview Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġ_ view State : ĠLive Data < S > Ġ= ĠMutable LiveData ( initial ViewState ) ĊĠĠĠ Ġval Ġview State : ĠLive Data < S > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ view State ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġuse ĠTransform ations . switch Map Ġto Ġapply Ġa Ġfunction Ġ( handle ) Ġto Ġthe Ġnext Action ĠLive Data , ĊĠĠĠĠ Ġ* Ġand ĠTransform ations . map Ġto Ġapply Ġa Ġfunction Ġ( reduce ) Ġto Ġthe Ġresult ant ĠLive Data . ĊĠĠĠĠ Ġ* ĠSo , Ġwe Ġensure Ġthat , Ġwhen Ġan Ġaction Ġis Ġdis patched , Ġthe Ġnext Action Ġvalue Ġwill Ġchange , ĊĠĠĠĠ Ġ* Ġcalling Ġhandle Ġfirst , Ġand Ġthen Ġreduce Ġwith Ġthe Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ view State Ġ= ĠTransform ations . map ( Transform ations . switch Map ( next Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle ( it ) ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreduce (_ view State . value Ġ?: Ġinitial ViewState , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġforce Ġevery ĠViewModel Ġto Ġmanage Ġthe Ġhandle Ġand Ġreduce Ġfunctions . ĊĠĠĠĠ Ġ* Ġ[ handle ]: Ġwill Ġcall Ġthe Ġcorresponding Ġuse Ġcase Ġdepending Ġon Ġthe Ġaction ĊĠĠĠĠ Ġ* Ġ[ reduce ]: Ġwill Ġreceive Ġthe Ġuse Ġcase Ġresult Ġand Ġthe Ġlast Ġstate , Ġand Ġwill Ġcreate Ġthe Ġnew Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġhandle ( action : ĠA ): ĠLive Data < R > ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġreduce ( current ViewState : ĠS , Ġresult : ĠR ): ĠS ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġthe Ġvalue Ġof Ġthe Ġ[ next Action ] ĠLive Data Ġwith Ġthe Ġnew Ġaction ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdispatch ( action : ĠA ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Dispatch : Ġ$ action ") ĊĠĠĠĠĠĠĠ Ġnext Action . value Ġ= Ġaction ĊĠĠĠ Ġ} Ċ }