package Ġorg . simple . clin ic . mob ius Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġcom . spotify . mob ius . Connect able Ċ import Ġcom . spotify . mob ius . Connection Ċ import Ġcom . spotify . mob ius . First . first Ċ import Ġcom . spotify . mob ius . Init Ċ import Ġcom . spotify . mob ius . Mob ius Loop Ċ import Ġcom . spotify . mob ius . Update Ċ import Ġcom . spotify . mob ius . android . Mob ius Android Ċ import Ġcom . spotify . mob ius . extras . Connect ables Ċ import Ġcom . spotify . mob ius . functions . Consumer Ċ import Ġcom . spotify . mob ius . functions . Function Ċ import Ġcom . spotify . mob ius . rx 2 . Rx Mob ius Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Transformer Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġorg . simple . clin ic . platform . crash . Crash Reporter Ċ import Ġkotlin . Lazy Thread Safety Mode . NONE Ċ Ċ class ĠMob ius Delegate < M Ġ: ĠParcel able , ĠE , ĠF >( ĊĠĠĠ Ġprivate Ġval Ġevents : ĠObservable < E >, ĊĠĠĠ Ġprivate Ġval Ġdefault Model : ĠM , ĊĠĠĠ Ġprivate Ġval Ġinit : ĠInit < M , ĠF > ?, ĊĠĠĠ Ġprivate Ġval Ġupdate : ĠUpdate < M , ĠE , ĠF >, ĊĠĠĠ Ġprivate Ġval Ġeffect Handler : ĠObservable Transformer < F , ĠE >, ĊĠĠĠ Ġprivate Ġval Ġmodel Update Listener : Ġ( M ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġcrash Reporter : ĠCrash Reporter Ċ ) Ġ: ĠConnect able < M , ĠE > Ġ{ ĊĠ Ġprivate Ġval Ġmodel Key Ġ= Ġdefault Model :: class . java . name ĊĠ Ġprivate Ġval Ġview State Key Ġ= Ġ" ViewState _$ model Key " ĊĊĠ Ġprivate Ġlateinit Ġvar Ġcontroller : ĠMob ius Loop . Controller < M , ĠE > ĊĊĠ Ġprivate Ġvar Ġlast Known Model : ĠM ? Ġ= Ġnull ĊĊĠ Ġprivate Ġval Ġloop Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠ Ġval Ġinit Ġ= Ġinit Ġ?: ĠInit Ġ{ Ġfirst ( default Model ) Ġ} ĊĊĠĠĠ ĠRx Mob ius ĊĠĠĠĠĠĠĠ Ġ. loop ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġmodel : ĠM , Ġevent : ĠE Ġ-> Ġupdate . update ( model , Ġevent ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġeffects Ġ-> Ġeffects . compose ( effect Handler ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. init ( init ) ĊĠĠĠĠĠĠĠ Ġ. event Source ( mob ius EventSource ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġmob ius EventSource Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠ ĠDeferred EventSource < E >( crash Reporter ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġlateinit Ġvar Ġevents Disposable : ĠDis posable ĊĊĠ Ġfun Ġprepare () Ġ{ ĊĠĠĠ Ġcontroller Ġ= ĠMob ius Android . controller ( loop , Ġlast Known Model Ġ?: Ġdefault Model ) ĊĠĠĠ Ġcontroller . connect ( Connect ables . contr amap ( identity (), Ġthis )) ĊĠĠĠ Ġlast Known Model Ġ= Ġnull ĊĠ Ġ} ĊĊĠ Ġfun Ġstart () Ġ{ ĊĠĠĠ Ġcontroller . start () ĊĠĠĠ Ġevents Disposable Ġ= Ġevents . subscribe Ġ{ Ġmob ius EventSource . notify Event ( it ) Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġstop () Ġ{ ĊĠĠĠ Ġif Ġ(:: events Disposable . isInitialized Ġ&& Ġevents Disposable . is Disposed . not ()) Ġ{ ĊĠĠĠĠĠ Ġevents Disposable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġstart Controller IfNot Already Running () ĊĠĠĠ Ġstop And Disconnect Controller () ĊĠ Ġ} ĊĊĠ Ġfun Ġon Save InstanceState ( android ViewState : ĠParcel able ?): ĠParcel able Ġ{ ĊĠĠĠ Ġreturn ĠBundle (). apply Ġ{ ĊĠĠĠĠĠ Ġput Parcelable ( view State Key , Ġandroid ViewState ) ĊĠĠĠĠĠ Ġput Parcelable ( model Key , Ġcontroller . model ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġon Restore InstanceState ( parcel able : ĠParcel able ?): ĠParcel able ? Ġ{ ĊĠĠĠ Ġval Ġbundle Ġ= Ġparcel able Ġas ? ĠBundle ĊĠĠĠ Ġlast Known Model Ġ= Ġbundle ?. get Parcelable ( model Key ) Ġ?: Ġdefault Model ĊĠĠĠ Ġreturn Ġbundle ?. get Parcelable < Parcelable ? >( view State Key ) ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġprepare () Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġconnect ( output : ĠConsumer < E >): ĠConnection < M > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠConnection < M > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( value : ĠM ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel Update Listener ( value ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġno - op , Ġnothing Ġto Ġdispose Ġ*/ ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġidentity (): ĠFunction < M , ĠM > Ġ= ĊĠĠĠĠĠ ĠFunction Ġ{ Ġit Ġ} ĊĊĠ Ġprivate Ġfun Ġstart Controller IfNot Already Running () Ġ{ ĊĠĠĠ Ġif Ġ( controller . isRunning . not ()) Ġ{ ĊĠĠĠĠĠ Ġcontroller . start () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstop And Disconnect Controller () Ġ{ ĊĠĠĠ Ġcontroller . stop () ĊĠĠĠ Ġcontroller . disconnect () ĊĠ Ġ} Ċ } Ċ