package Ġ<%= Ġapp Package Ġ% >. base . ui ĊĊ Ċ import Ġandroid . arch . lifecycle . ViewModel Ċ import Ġandroid . support . annotation . Call Super Ċ import Ġ<%= Ġapp Package Ġ% >. base . events . Event Ċ import Ġ<%= Ġapp Package Ġ% >. base . util . observe On MainThread Ċ import Ġcom . jak ew h art on . rx relay 2 . Behavior Relay Ċ import Ġcom . jak ew h art on . rx relay 2 . Publish Relay Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ // todo Ġthink Ġabout Ġhaving Ġthe Ġstarting Ġstate Ġbe Ġpasses Ġas Ġa Ġper am , Ċ // todo Ġmake Ġall Ġthis Ġbase Ġstuff Ġa Ġmod ual Ġand Ġmake Ġsome Ġthings Ġinternal Ċ /** Ċ Ġ* Ġ Ġgets Ġ[ Event ] s Ġvia Ġadd Ġevent Ġthen Ġmut ates Ġ[ State ] Ġ Ġand / or Ġtriggers Ġasynchronous Ġaction Ġthat Ġwill Ġcome back Ġwith Ġa Ġnew Ġ[ Event ] Ċ Ġ* Ġ Ġafter Ġstate Ġis Ġmut ated Ġits Ġpublished Ġto Ġthe Ġstate Ġrelay Ġfor Ġob serves Ġto Ġreact Ġto Ċ Ġ*/ Ċ abstract Ġclass ĠBase ViewModel < T Ġ: ĠBase State > Ġ: ĠViewModel () Ġ{ ĊĊĠĠ Ġprotected Ġvar Ġstate Ġby ĠDeleg ates . observable ( init State , Ġ{ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠ Ġif Ġ( old Ġ!= Ġnew ) Ġ{ ĊĠĠĠĠĠ Ġstate Data Relay . accept ( new ) ĊĠĠĠ Ġ} ĊĠ Ġ}) ĊĠ Ġprotected Ġval Ġdis posable Ġ= ĠComposite Disposable () ĊĠ Ġprivate Ġval Ġinit State Ġget () Ġ= Ġinit State () ĊĠ Ġ// todo Ġmaybe Ġinject ? Ġ Ġthink Ġabout Ġwrapping Ġinto Ġits Ġown Ġclass ? ĊĠ Ġprotected Ġval Ġevent Relay : ĠPublish Relay < Event > Ġ= ĠPublish Relay . create () ĊĠ Ġprivate Ġval Ġstate Data Relay Ġ= ĠBehavior Relay . create Default ( init State ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġstate Data Relay . accept ( state ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġobserve State Ġtakes Ġan Ġ[ observer ] Ġfun Ġthat Ġgets Ġcalled Ġwhen Ġever Ġstate Ġupdates ĊĠĠ Ġ*/ ĊĠ Ġinternal Ġfun Ġobserve State ( observer : Ġ( T ) Ġ-> ĠUnit ): ĠDis posable Ġ{ ĊĠĠĠ Ġreturn Ġstate Data Relay . observe On MainThread (). subscribe Ġ{ Ġobserver ( it ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġadds Ġan Ġ[ Event ] Ġto Ġthe Ġ[ event Relay ] ĊĠĠ Ġ*/ ĊĠ Ġfun Ġadd Event ( event : ĠEvent ) Ġ{ ĊĠĠĠ Ġevent Relay . accept ( event ) ĊĠ Ġ} ĊĊĠ Ġ@ Call Super ĊĠ Ġopen Ġfun Ġinit () Ġ{ ĊĠĠĠ Ġif Ġ( dis posable . size () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġcreate Event Stream () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ last State ] Ġgives Ġyou Ġthe Ġlast Ġstate Ġin Ġthe Ġ[ state Data Relay ] ĊĠĠ Ġ*/ ĊĠ Ġval Ġlast State : ĠT Ġget () Ġ= Ġstate Data Relay . blocking First ( init State ()) ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġset Ġup Ġfor Ġevent Ġstream Ġand Ġadds Ġhook Ġfor Ġhandling Ġevents Ġin Ġ[ handle Events ] ĊĠĠ Ġ*/ ĊĠ Ġprotected Ġfun Ġcreate Event Stream () Ġ{ ĊĠĠĠ Ġdis posable . add ( ĊĠĠĠĠĠĠĠ Ġevent Relay . observe On MainThread () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( this :: handle Events ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġstate Ġ= Ġit Ġ}) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġhandles Ġincoming Ġevents Ġand Ġreturns Ġnew Ġstate Ġ[ T ] ĊĠĠ Ġ*/ ĊĠ Ġabstract Ġfun Ġhandle Events ( event : ĠEvent ): ĠT ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġstarting Ġstate Ġfor Ġview ĊĠĠ Ġ*/ ĊĠ Ġabstract Ġfun Ġinit State (): ĠT ĊĊĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠ Ġdis posable . dispose () ĊĠĠĠ Ġsuper . on Cle ared () ĊĠ Ġ} Ċ Ċ }