package Ġcom . ba el . kir in . lib . base . view model Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ba el . kir in . lib . logger . contract . Logger Ċ import Ġcom . ba el . kir in . lib . threading . contract . Threading Ċ import Ġcom . ba el . kir in . lib . threading . executor . contract . Executor Ċ import Ġcom . ba el . kir in . lib . threading . executor . schema . Executor Schema Ċ import Ġcom . ba el . kir in . lib . threading . executor . schema . Executor Schema . Concurrent Ċ import Ġcom . ba el . kir in . lib . threading . executor . schema . Executor Schema . Queue Ċ import Ġcom . ba el . kir in . lib . threading . util . Util . Default Thread Ċ import Ġcom . ba el . kir in . lib . threading . util . Util . MainThread Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . scan Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠEr ick Sum argo Ġon Ġ 0 1 / 0 6 / 2 0 . Ċ Ġ*/ Ċ Ċ @ Experimental Cor outines Api Ċ abstract Ġclass ĠBase ViewModel < S , ĠI >( ĊĠĠĠ Ġinit State : ĠS , ĊĠĠĠ Ġinit Intent : ĠI ?, ĊĠĠĠ Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle ? Ġ= Ġnull , ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ġ= ĠDefault Thread , ĊĠĠĠ Ġoverride Ġval Ġexecutor Schema : ĠExecutor Schema Ġ= ĠQueue Ċ ) Ġ: ĠViewModel (), ĊĠĠĠ ĠThread ing Ġ{ ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġexecutor : ĠExecutor ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġlogger : ĠLogger ĊĊĠĠĠ Ġprivate Ġval Ġrestored State : ĠS Ġ= Ġsaved State Handle ?. get ( KEY _ SA VED _ STATE ) Ġ?: Ġinit State ĊĠĠĠ Ġprivate Ġval Ġmutable State Flow : ĠMutable State Flow < S > Ġ= ĠMutable State Flow ( restore d State ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHere Ġwe Ġdon 't Ġwant Ġto Ġreplay Ġthe Ġprevious Ġoccurred Ġintent ĊĠĠĠĠ Ġ* Ġcached Ġby Ġsaved State Handle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt Ġshould Ġobserve Ġfor Ġthe Ġincoming Ġnew Ġintent Ġinstead . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmutable Intent Flow : ĠMutable State Flow < I ?> Ġ= ĠMutable State Flow ( init Intent ) ĊĊĠĠĠ Ġprivate Ġval Ġmutable State Data : ĠMutable LiveData < Pair < S ?, ĠS >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġmutable Intent Data : ĠMutable LiveData < I ?> Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġinternal Ġval Ġstates : ĠLive Data < Pair < S ?, ĠS >> Ġget () Ġ= Ġmutable State Data ĊĠĠĠ Ġinternal Ġval Ġintent : ĠLive Data < I ?> Ġget () Ġ= Ġmutable Intent Data ĊĊĠĠĠ Ġprotected Ġval Ġstate : ĠS Ġget () Ġ= Ġmutable State Flow . value ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve State () ĊĠĠĠĠĠĠĠ Ġobserve Intent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlaunch ( ĊĠĠĠĠĠĠĠ Ġthread : ĠCor outine Context , ĊĠĠĠĠĠĠĠ Ġschema : ĠExecutor Schema , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( context Ġ= Ġthread ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInvest igate Ġproperties Ġexecutor Ġand Ġlogger Ġare Ġnot Ġinjected Ġinstant ly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġthis Ġclass Ġin Ġinstantiation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: executor . isInitialized . not ()) Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġexecutor . execute ( schema ) Ġ{ Ġblock () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log ( cause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve State () Ġ= Ġlaunch ( ĊĠĠĠĠĠĠĠ Ġthread Ġ= ĠMain Thread , ĊĠĠĠĠĠĠĠ Ġschema Ġ= ĠConcurrent ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable State Flow . scan ( null Ġas ĠS ?) Ġ{ Ġprevious State , ĠnewState Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable State Data . value Ġ= Ġprevious State Ġto ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewState ĊĠĠĠĠĠĠĠ Ġ}. collect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Intent () Ġ= Ġlaunch ( ĊĠĠĠĠĠĠĠ Ġthread Ġ= ĠMain Thread , ĊĠĠĠĠĠĠĠ Ġschema Ġ= ĠConcurrent ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable Intent Flow . collect Ġ{ Ġintent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Intent Data . value Ġ= Ġintent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave State ( newState : ĠS ) Ġ= Ġlaunch ( ĊĠĠĠĠĠĠĠ Ġthread Ġ= ĠMain Thread , ĊĠĠĠĠĠĠĠ Ġschema Ġ= ĠConcurrent ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsaved State Handle ?. set ( KEY _ SA VED _ STATE , ĠnewState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġrender ( newState : ĠS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsave State ( newState ) ĊĠĠĠĠĠĠĠ Ġmutable State Flow . value Ġ= ĠnewState ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġaction ( new Intent : ĠI ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable Intent Flow . value Ġ= Ġnew Intent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ SA VED _ STATE : ĠString Ġ= Ġ" saved _ state " ĊĠĠĠ Ġ} Ċ } Ċ