package Ġit . coding jam . github . util ĊĊ Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . flow On Ċ Ċ class ĠView State Store Factory ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdispatcher : ĠCor outine Dispatcher Ċ ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġ< T Ġ: ĠAny > Ġinvoke ( initialState : ĠT , Ġscope : ĠCor outine Scope ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView State Store ( initialState , Ġscope , Ġdispatcher ) Ċ } Ċ Ċ class ĠView State Store < T Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ ĠinitialState : ĠT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdispatcher : ĠCor outine Dispatcher Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstate LiveData Ġ= ĠMutable LiveData < T >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= ĠinitialState ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsignals LiveData Ġ= ĠEvents LiveData < Signal >() ĊĊĠĠĠ Ġfun Ġobserve ( owner : ĠLifecycle Owner , Ġobserver : Ġ( T ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate LiveData . observe ( owner , ĠObserver Ġ{ Ġobserver ( it !! ) Ġ}) ĊĊĠĠĠ Ġfun Ġobserve Signals ( owner : ĠLifecycle Owner , Ġobserver : Ġ( Signal ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignals LiveData . observe ( owner ) Ġ{ Ġobserver ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġdispatch State ( state : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch ( Dispatch ers . Main . immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate LiveData . value Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch Signal ( action : ĠSignal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsignals LiveData . add Event ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch ( action : ĠAction < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġis ĠState Action < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate LiveData . value Ġ= Ġaction ( invoke ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( action Ġis ĠSignal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignals LiveData . add Event ( action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch Action ( f : Ġsuspend Ġ() Ġ-> ĠAction < T >) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġdispatch Actions ( flow Ġ{ Ġemit ( f ()) Ġ}) ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ( action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch Actions ( flow : ĠActions Flow < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flow On ( dispatcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke () Ġ= Ġstate LiveData . value !! Ċ }