package Ġru . fab it . store Ċ Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Observer Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . functions . Consumer Ċ import Ġio . reactivex . ob servers . Disposable Observer Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġio . reactivex . subscribers . Disposable Subscriber Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ abstract Ġclass ĠBase Store < State , ĠAction >( ĊĠĠĠ Ġprivate Ġvar Ġcurrent State : ĠState , ĊĠĠĠ Ġprivate Ġvar Ġreducer : ĠRed ucer < State , ĠAction >, ĊĠĠĠ Ġprivate Ġval Ġbootstrap per : Ġ() Ġ-> ĠSingle < Action >, ĊĠĠĠ Ġprivate Ġval Ġside Effects : ĠIterable < Side Effect < State , ĠAction >> Ġ= ĠCopy On Write ArrayList (), ĊĠĠĠ Ġprivate Ġval Ġaction Sources : ĠIterable < Action Source < Action >> Ġ= ĠCopy On Write ArrayList (), ĊĠĠĠ Ġprivate Ġval Ġbind Action Sources : ĠIterable < Bind Action Source < Action >> Ġ= ĠCopy On Write ArrayList (), ĊĠĠĠ Ġprivate Ġval Ġaction Handlers : ĠIterable < Action Handler < Action >> Ġ= ĠCopy On Write ArrayList () Ċ ) Ġ: ĠStore < State , ĠAction > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdis posable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġsource Disposable Ġ= ĠSource Disposable () ĊĊĠĠĠ Ġprivate Ġval Ġaction Subject Ġ= ĠPublish Subject . create < Action >() ĊĠĠĠ Ġprivate Ġval Ġstate Subject Ġ= ĠBehavior Subject . create Default ( currentState ) ĊĠĠĠ Ġprivate Ġval Ġside Effect Subject Ġ= ĠPublish Subject . create < Pair < State , ĠAction >>() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable . add ( reduce ()) ĊĠĠĠĠĠĠĠ Ġdis posable . add ( side Effect Dispatch ()) ĊĠĠĠĠĠĠĠ Ġbind Action Source Dispatch () ĊĠĠĠĠĠĠĠ Ġdis posable . add ( bootstrap per (). subscribe ( Consumer Ġ{ Ġdispatch Action ( it ) Ġ})) ĊĠĠĠĠĠĠĠ Ġaction Source Dispatch () ĊĠĠĠĠĠĠĠ Ġaction Handler Dispatch () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐŀ ÑĤ Ð¿ÑĢÐ°Ð² Ð»Ñı ÐµÑĤ ĠÑģ Ð¾Ð±Ñĭ ÑĤÐ¸ Ðµ ĠÐ½Ð° ĠÐ¾Ð± ÑĢÐ°Ð±Ð¾ÑĤ ÐºÑĥ ĠÐ² Ġreducer ĠÐ° ĠÑĤÐ°Ðº ĠÐ¶Ðµ ĠÐ² Ð»Ð¸ Ñı ÐµÑĤ ĠÐ½Ð° ĠÐ·Ð°Ð¿ ÑĥÑģ Ðº ĠÑģ Ð°Ð¹ Ð´ - Ñį ÑĦ ÑĦ ÐµÐºÑĤ Ð¾Ð² ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġaction Ġ- ĠÑģ Ð¾Ð±Ñĭ ÑĤÐ¸ Ðµ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdispatch Action ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Subject . onNext ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe ( observer : ĠObserver < in ĠState >, Ġobserver On Scheduler : ĠScheduler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed Ġ{ Ġstate 1 : ĠState , Ġstate 2 : ĠState Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate 1 Ġ== Ġstate 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( observer On Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunsubscribe ( observer : ĠDis posable Observer < in ĠState >) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserver . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable . clear () ĊĠĠĠĠĠĠĠ Ġsource Disposable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreduce (): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Pass age Ġthrough Ġthe Ġreducer Ġshould Ġbe Ġone Ġat Ġa Ġtime ĊĠĠĠĠĠĠĠ Ġval Ġcount Request Item Ġ= Ġ 1 L ĊĊĠĠĠĠĠĠĠ Ġval Ġsubscriber Ġ= Ġobject Ġ: ĠDis posable Subscriber < Action >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ( count Request Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġreducer . pr er ed uce ( state Subject . value , Ġaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġstate Subject . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Subject . onNext ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect Subject . onNext ( Pair ( state , Ġaction )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ( count Request Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ?. printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaction Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able ( Back pressure Strategy . BUFFER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( subscriber ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsubscriber ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġside Effect Dispatch (): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġside Effect Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able ( Back pressure Strategy . LATE ST ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . merge ( side Effects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġside Effect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect ( pair . first , Ġpair . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe ({ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Subject . onNext ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġit . printStackTrace () Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġaction Handler Dispatch () Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Handlers . map Ġ{ Ġhandler Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Disposable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġhandler . query ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( handler . handler Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . invoke ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaction Source Dispatch () Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Sources . map Ġ{ Ġaction Source Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Disposable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Source . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Source (). subscribe Ġ{ Ġaction Ġ-> Ġaction Subject . onNext ( action ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Action Source Dispatch () Ġ{ ĊĠĠĠĠĠĠĠ Ġbind Action Sources . map Ġ{ Ġaction Source Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Disposable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Source . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġaction Source . query ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ Ġaction Source ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Subject . onNext ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe Ġ-> Ġe . printStackTrace () Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }