package Ġcom . github . ny times news app . base . presentation . view model Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . github . ny times news app . base . domain . Base UseCase Ċ import Ġcom . github . ny times news app . base . presentation . model . Base UI Model Ċ import Ġcom . github . ny times news app . core . Single Live Event Ċ Ċ open Ġclass ĠBase ViewModel < State >( default State : ĠState ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġstate LiveData : ĠMutable LiveData < Base State < State >> Ġ= ĠMutable LiveData < Base State < State >>() ĊĠĠĠ Ġval Ġcommand LiveData : ĠSingle Live Event < Base Command > Ġ= ĠSingle Live Event () ĊĊĠĠĠ Ġprivate Ġval Ġbase State : ĠBase State < State >? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate LiveData . value ?. copy () ĊĊĠĠĠ Ġinternal Ġval Ġstate : ĠState ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbase State ?. state ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstate LiveData . value Ġ= ĠBase State ( state Ġ= Ġdefault State ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġopen Ġfun Ġ< Params Type , ĠResult Type > ĠBase UseCase < Params Type , ĠResult Type >. fetch Data ( ĊĠĠĠĠĠĠĠ Ġparams : ĠParams Type , ĊĠĠĠĠĠĠĠ ĠonSuccess : Ġsuspend Ġ( Result Type ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke ( viewModel Scope , Ġparams , Ġon Finished Ġ= ĠonSuccess ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġclass ĠBase Command ĊĊĠĠĠ Ġinline Ġfun ĠsetState ( func : ĠState . () Ġ-> ĠState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Base State Ġ{ Ġcopy ( state Ġ= Ġstate . func ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġset Base State ( func : ĠBase State < State >. () Ġ-> ĠBase State < State >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate LiveData . value Ġ= Ġstate LiveData . value ?. copy ()?. func () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠBase State < Extra State > Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġstate : ĠExtra State , ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠList < Base UI Model > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠ Ġval Ġrefresh ing : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ċ }