package Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies . view model Ċ Ċ import Ġcom . android . t ait asci ore . pri val i atest . feature . popular movies .* Ċ import Ġcom . android . t ait asci ore . pri val i atest . presentation . base . Base ViewModel Impl Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Transformer Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠViewModel Ġfor ĠPop ular Movies Fragment Ġthat Ġreceives ĠPop ular Movies Ui Event 's , Ċ Ġ* Ġmaps Ġthem Ġto Ġa ĠPop ular Movies Action Ġto Ġbe Ġprocessed Ġby Ġthe Ġaction Ġprocessor , Ċ Ġ* Ġwhich Ġwill Ġproduce Ġa ĠPop ular Movies Result , Ġwhich Ġwill Ġbe Ġthen Ġpassed Ġto Ġthe Ċ Ġ* Ġstate Ġreducer , Ġwhich Ġwill Ġbuild Ġa ĠPop ular Movies ViewState Ġfrom Ġthe Ġprevious Ġstate Ċ Ġ* Ġ+ Ġnew Ġresult Ġ:) Ċ Ġ*/ Ċ class ĠPop ular Movies ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpopular Movies Action Processor : ĠPop ular Movies Action Processor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpopular Movies State Reducer : ĠPop ular Movies State Reducer ) ĊĠĠĠ Ġ: ĠBase ViewModel Impl < Pop ular Movies Ui Event , ĠPop ular Movies ViewState >() Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġtakes Ġcare Ġof Ġfiltering Ġcertain ĠUi Events , Ġsuch Ġas Ġthe ĠInitial Ġevent , ĊĠĠĠĠ Ġ* Ġensuring Ġthat Ġit 's Ġhandled Ġonce Ġand Ġonce Ġonly . ĠFurther Ġincoming ĠInitial Ġevents ĊĠĠĠĠ Ġ* Ġwill Ġbe Ġfiltered Ġout ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġevent Filter Ġ= ĠObservable Transformer < Pop ular Movies Ui Event , ĠPop ular Movies Ui Event > Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠ Ġevent . publish Ġ{ Ġshared Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . merge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared . of Type ( Pop ular Movies Ui Event . Initial :: class . java ). take ( 1 ), Ġ// ĠTake Ġthe Ġfirst Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared . filter Ġ{ Ġit Ġ! is ĠPop ular Movies Ui Event . Initial Ġ} Ġ// ĠIgnore Ġif Ġit ' Ġan ĠInitial Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstates Observable Ġ= Ġcompose () ĊĠĠĠĠĠĠĠ Ġadd Disposable ( states Observable . subscribe Ġ{ Ġstates LiveData . value Ġ= Ġit Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġme hod Ġmaps Ġa ĠPop ular Movies Ui Event Ġto Ġits Ġcorresponding ĠPop ular Movies Action ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠUi Event Ġto Ġbe Ġmapped Ġto ĠAction ĊĠĠĠĠ Ġ* Ġ@ return ĠM apped ĠAction Ġfrom ĠUi Event ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġaction From Event ( event : ĠPop ular Movies Ui Event ): ĠPop ular Movies Action Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPop ular Movies Ui Event . Initial Ġ-> ĠPop ular Movies Action . Load First Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPop ular Movies Ui Event . Load First Ġ-> ĠPop ular Movies Action . Load First Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPop ular Movies Ui Event . Load Next Ġ-> ĠPop ular Movies Action . Load Next Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPop ular Movies Ui Event . Retry Ġ-> ĠPop ular Movies Action . Load First Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPop ular Movies Ui Event . Retry Search Ġ-> ĠPop ular Movies Action . Search Movies ( event . query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPop ular Movies Ui Event . Search Ġ-> ĠPop ular Movies Action . Search Movies ( event . query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPop ular Movies Ui Event . Load Next Search Ġ-> ĠPop ular Movies Action . Load Next Search Page ( event . query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġwhere Ġthe Ġmagic Ġhappens ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcompose (): ĠObservable < Pop ular Movies ViewState > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġevents Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( event Filter ) Ġ// ĠFilter ĠUi Event 's ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġaction From Event ( it ) Ġ} Ġ// ĠMap ĠUi Event Ġto ĠAction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( popular Movies Action Processor . result From Action ()) Ġ// ĠProcess Ġaction Ġand Ġgenerate ĠPop ular Movies Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. scan ( Pop ular Movies ViewState ( false , Ġnull , Ġnull ), Ġpopular Movies State Reducer ) Ġ// ĠReduce ĠPop ular Movies Result Ġto ĠPop ular Movies ViewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replay ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. auto Connect ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġemits Ġan Ġitem Ġto Ġthe ĠUi Events ĠPublish Subject Ġto Ġbe Ġprocessed ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠUi Event Ġto Ġbe Ġprocessed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsend Event ( event : ĠPop ular Movies Ui Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevents Subject . onNext ( event ) ĊĠĠĠ Ġ} Ċ }