package Ġdev . f red ag . che er with me Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ Ċ abstract Ġclass ĠBase ViewModel < ViewState , ĠView Action , ĠView Event > Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġstate Ġof Ġthe Ġview Ġthis Ġview Ġmodel Ġis Ġrepresenting ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ view State Ġby Ġlazy Ġ{ ĠMutable State Flow ( initial ViewState ()) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġreadonly Ġstate Ġfor Ġthe Ġview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġview State Ġ= Ġ_ view State . as State Flow () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġflow Ġfor Ġthe ĠViewModel Ġto Ġsend Ġevents Ġto Ġthe ĠUI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġ_ view Event : ĠMutable Shared Flow < View Event > Ġ= ĠMutable Shared Flow () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġflow Ġfor Ġthe ĠUI Ġto Ġconsume Ġto Ġbe Ġnotified Ġof Ġevents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġview Event : ĠShared Flow < View Event > Ġ= Ġ_ view Event ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlow Ġfor Ġactions Ġcoming Ġfrom Ġthe Ġview Ġto Ġthe Ġview Ġmodel . ĊĠĠĠĠ Ġ* ĠActions Ġare Ġfired Ġfrom Ġthe Ġsend Actions Ġmethod Ġbelow ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġactions Flow : ĠMutable Shared Flow < View Action > Ġ= ĠMutable Shared Flow () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCollect Ġactions Ġfrom Ġthe Ġactions Flow Ġand Ġgive Ġthem Ġto Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġhandle Action Ġmethod Ġimplemented Ġby Ġthe Ġthe Ġconcrete Ġview Ġmodel ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions Flow . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Action ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠL ets Ġthe ĠUI Ġsend Ġactions Ġto Ġthe Ġview Ġmodel ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsend Action ( action : ĠView Action ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġactions Flow . emit ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠL ets Ġthe ĠViewModel Ġsend Ġevents Ġto Ġthe ĠUI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsend Event ( event : ĠView Event ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ view Event . emit ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSetter Ġfor Ġthe Ġstate Ġonly Ġavailable Ġto Ġinherit ing Ġview Ġmodels ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun ĠsetState ( state : ĠView State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ view State . value Ġ= Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠsetState ( update State : Ġ( previous State : ĠView State ) Ġ-> ĠView State ) Ġ= ĊĠĠĠĠĠĠĠ ĠsetState ( update State ( view State . value )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġgets Ġcalled Ġfor Ġevery Ġaction Ġemitted Ġfrom Ġthe Ġview Ġusing Ġthe Ġsend Action Ġfunction ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġhandle Action ( it : ĠView Action ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeclare Ġthe Ġdefault Ġvalue Ġof Ġthe Ġview Ġstate Ġto Ġinitialize Ġthe Ġ_ view State ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġinitial ViewState (): ĠView State Ċ } Ċ