package Ġcom . github . vit av iva . m vi Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġkotlin . reflect . K Class Ċ Ċ abstract Ġclass ĠBase ViewModel < S Ġ: ĠView State , ĠA Ġ: ĠAction >( initialState : ĠS ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġnext Action Ġ= ĠMutable LiveData < Pair < A , ĠPost Action >>() ĊĠĠĠ Ġlateinit Ġvar Ġview State : ĠLive Data < S > ĊĊĠĠĠ Ġprivate Ġval Ġreducer Map : ĠMap < K Class < out ĠA >, ĠRed ucer < S , ĠAction >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠRed ucer Register (). also Ġ{ ĠonStart ( it ) Ġ}. map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġinner Ġclass ĠRed ucer Register Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġmap Ġ= Ġmutable Map Of < K Class < out ĠA >, ĠRed ucer < S , ĠAction >>() ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠA > Ġadd Reducer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction : ĠK Class < T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreducer : ĠRed ucer < S , ĠT > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġaction Ġ|| Ġit . java . isAssignableFrom ( action . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" D ON ' T Ġadd Ġreducer Ġwith Ġsame Ġaction Ġrepeatedly ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ action ] Ġ= Ġreducer Ġas ĠRed ucer < S , ĠAction > ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun ĠonStart ( register : ĠRed ucer Register ) ĊĊĠĠĠ Ġfun Ġdispatch ( action : ĠA , Ġafter : ĠPost Action Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġnext Action . value Ġ= Ġaction Ġto Ġafter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreducer Of ( action : ĠA ) Ġ= ĊĠĠĠĠĠĠĠ Ġreducer Map . entries . first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġ== Ġaction Ġ|| Ġit . key . java . isAssignableFrom ( action . java Class )) ĊĠĠĠĠĠĠĠ Ġ}. value ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġview State Ġ= ĠTransform ations . switch Map ( next Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data ( viewModel Scope . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreducer Ġ= Ġreducer Of ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer . invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLive Coroutine Scope Impl ( this @ live Data , ĠviewModel Scope ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . value Ġ?: ĠinitialState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ type alias ĠPost Action Ġ= Ġsuspend Ġ() Ġ-> ĠUnit Ċ Ċ interface ĠAction Ċ Ċ interface ĠView State Ċ Ċ type alias ĠRed ucer < S , ĠA > Ġ= Ġsuspend ĠLive Coroutine Scope < S >. ( current ViewState : ĠS , Ġaction : ĠA ) Ġ-> ĠUnit Ċ