package Ġcom . example . ui . m vi . presenter Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . example . ui . view model . Base ViewModel Ċ import Ġcom . example . ui . view model . st ater ed ucer . State Reducer Ċ import Ġio . reactivex . rx java 3 . core . Comp letable Ċ import Ġio . reactivex . rx java 3 . core . Maybe Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx java 3 . subjects . Publish Subject Ċ Ċ abstract Ġclass ĠBase Presenter < State Ġ: ĠAny , ĠVM : ĠBase ViewModel < State , Ġ* >> Ġ: ĠPres enter Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġattach Subject : ĠPublish Subject < Unit > Ġ= ĠPublish Subject . create () ĊĊĠĠĠ Ġprotected Ġval Ġintent Subject : ĠPublish Subject < Any > Ġ= ĠPublish Subject . create () ĊĊĠĠĠ Ġprivate Ġval Ġcomposite Disposable : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar ĠviewModel : ĠVM ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( vm : ĠViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġ( vm Ġas ? ĠVM ) Ġ?: Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Created () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . init () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach () Ġ{ ĊĠĠĠĠĠĠĠ Ġattach Subject . onNext ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detach () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend ( intent : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġintent Subject . onNext ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< State Ġ: ĠAny > Ġobserve StateChange (): ĠObservable < State Reducer . StateChange < State >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠviewModel . observe StateChange () Ġas ĠObservable < State Reducer . StateChange < State >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġattach Observable (): ĠObservable < Unit > Ġ= Ġattach Subject ĊĊĠĠĠ Ġprotected Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġintent Of (): ĠObservable < T > Ġ= Ġintent Subject . of Type ( T :: class . java ) ĊĊĠĠĠ Ġprotected Ġfun Ġ< T > ĠObservable < T >. subscribe T ill Destroy ( onError : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{}, Ġblock : Ġ(( T ) Ġ-> ĠUnit ) Ġ= Ġ{}) Ġ= Ġcomposite Disposable . add ( this . subscribe ( block , ĠonError )) ĊĠĠĠ Ġprotected Ġfun Ġ< T > ĠMaybe < T >. subscribe T ill Destroy ( onError : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{}, Ġblock : Ġ(( T ) Ġ-> ĠUnit ) Ġ= Ġ{}) Ġ= Ġcomposite Disposable . add ( this . subscribe ( block , ĠonError )) ĊĠĠĠ Ġprotected Ġfun ĠComp letable . subscribe T ill Destroy ( onError : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{}, Ġblock : Ġ(() Ġ-> ĠUnit ) Ġ= Ġ{}) Ġ= Ġcomposite Disposable . add ( ĊĠĠĠĠĠĠĠ Ġthis . subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ) Ċ }