package Ġorg . reactor x . state Ċ Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Transformer Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . functions . Consumer Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġorg . reactor x . state . model . Action Ċ import Ġorg . reactor x . state . model . impl . Init Ċ import Ġorg . reactor x . state . model . impl . Void Ċ Ċ /** Ċ Ġ* Ġ@ author ĠFil ip ĠPro ch az ka Ġ(@ fil ip pro ch ) Ċ Ġ*/ Ċ class ĠState Store < T >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreducer : Ġ( T , ĠAction ) Ġ-> ĠT , ĊĠĠĠĠĠĠĠ ĠinitialState : ĠT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtransform ers : ĠList < Observable Transformer < Action , ĠAction >>, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmiddleware : ĠList < Middleware >, ĊĠĠĠĠĠĠĠ Ġsubscribe Immediate ly : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġerror Callback : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġ/* ĠHack Ġnot Ġto Ġbreak Ġbuild Ġwith Ġupgrade Ġto Ġnewer Ġversion , ĠTODO : Ġremove Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġextra Transformer Observable s Ob t ainer : Ġ(( Observable < Action >) Ġ-> ĠArray < Observable < out Ġorg . reactor x . presenter . model . Action >> )? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsubject Ġ= ĠPublish Subject . create < Action >() ĊĠĠĠ Ġvar Ġcurrent State : ĠT Ġ= ĠinitialState ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġval Ġpre State Middleware Subject Ġ= ĠPublish Subject . create < Action >() ĊĠĠĠ Ġprivate Ġval Ġpost State Middleware Subject Ġ= ĠPublish Subject . create < Action >() ĊĊĠĠĠ Ġprivate Ġval Ġinternal Subscriptions Disposable : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġval Ġtransformer Ġ= ĠObservable Transformer < Action , ĠAction > Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠ Ġstream . publish Ġ{ Ġshared Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġobservable s : ĠList < Observable < out ĠAction >> Ġ= Ġtransform ers . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Stream . compose ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġerror Callback ?. invoke ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Transformer Observable s Ob t ainer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobservable s Ġ= Ġobservable s . plus ( it . invoke ( shared Stream )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . merge Delay Error ( observable s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreduce Transformer Ġ= ĠObservable Transformer < Action , ĠPair < Action , ĠT >> Ġ{ Ġactions Ġ-> ĊĠĠĠĠĠĠĠ Ġactions . scan ( Pair ( ACTION _ VOID , ĠinitialState ), Ġ{ Ġstate Wrapper : ĠPair < Action , ĠT >, Ġaction : ĠAction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( action , Ġinternal Reducer ( state Wrapper . second , Ġaction )) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġobservable Ġ= Ġsubject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( ACTION _ INIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġinvoke Pre State Middleware ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( reduce Transformer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġ( action , Ġ_) Ġ-> Ġinvoke Post State Middleware ( action ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ(_, ĠnewState ) Ġ-> ĠnewState Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replay ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. auto Connect () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġmiddleware Ġstreams ĊĠĠĠĠĠĠĠ Ġinternal Subscriptions Disposable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre State Middleware Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( new Middleware Transformer ( Middleware . PHASE _ BEFORE _ STATE _ CHANGED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġerror Callback ?. invoke ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( dispatch ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġinternal Subscriptions Disposable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost State Middleware Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( new Middleware Transformer ( Middleware . PHASE _ AFTER _ STATE _ CHANGED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġerror Callback ?. invoke ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( dispatch ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġconfigured , Ġimmediately Ġaccept Ġdis patched Ġactions Ġ( don 't Ġwait Ġfor Ġobserve () Ġto Ġbe Ġcalled ) ĊĠĠĠĠĠĠĠ Ġif Ġ( subscribe Immediate ly ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Subscriptions Disposable . add ( observable . subscribe ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinvoke Pre State Middleware ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction : ĠAction ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpre State Middleware Subject . onNext ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinvoke Post State Middleware ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction : ĠAction ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost State Middleware Subject . onNext ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinternal Reducer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction : ĠAction ĊĠĠĠ Ġ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= Ġreducer . invoke ( state , Ġaction ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent State ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnew Middleware Transformer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġphase : ĠInt ĊĠĠĠ Ġ): ĠObservable Transformer < Action , ĠAction > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable Transformer Ġ{ Ġactions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions . publish Ġ{ Ġshared Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . merge Delay Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmiddleware . filter Ġ{ Ġit . phase Ġ== Ġphase Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . transformer Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġshared Stream . compose ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve (): ĠObservable < T > Ġ= Ġobservable ĊĊĠĠĠ Ġfun Ġdispatch ( input : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( internal Subscriptions Disposable . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" State Store Ġis Ġdisposed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsubject . onNext ( input ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch (): ĠConsumer < Action > Ġ= ĠConsumer Ġ{ Ġdispatch ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġdispatch Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput : ĠAction ĊĠĠĠ Ġ) Ġ= ĠComp letable . create Ġ{ ĊĠĠĠĠĠĠĠ Ġdispatch ( input ) ĊĊĠĠĠĠĠĠĠ Ġit . onComplete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject . onComplete () ĊĠĠĠĠĠĠĠ Ġinternal Subscriptions Disposable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠACTION _ INIT Ġget () Ġ= ĠInit () ĊĠĠĠĠĠĠĠ Ġval ĠACTION _ VOID Ġget () Ġ= ĠVoid () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder < T >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠinitialState : ĠT ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġreducer : Ġ( T , ĠAction ) Ġ-> ĠT ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtransform ers : ĠMutable List < Observable Transformer < Action , ĠAction >> Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmiddleware : ĠMutable List < Middleware > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsubscribe Immediate ly : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġerror Callback : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġextra Transformer Observable s Ob t ainer : Ġ(( Observable < Action >) Ġ-> ĠArray < Observable < out Ġorg . reactor x . presenter . model . Action >> )? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġenable Input Pas st rough ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter : Ġ(( Action ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Transformer ( Observable Transformer Ġ{ Ġinput Actions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Actions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Actions . filter ( filter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwith Reducer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer : Ġ( T , ĠAction ) Ġ-> ĠT ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . reducer Ġ= Ġreducer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwith Transformer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Ġtransform ers : ĠObservable Transformer < Action , ĠAction > ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . transformers . addAll ( transformers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwith Transform ers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ers : ĠCollection < Observable Transformer < Action , ĠAction >> ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . transformers . addAll ( transformers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwith Middleware ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Ġtransform ers : ĠObservable Transformer < Action , ĠAction >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphase : ĠInt Ġ= ĠMiddleware . PHASE _ AFTER _ STATE _ CHANGED ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . middleware . addAll ( transformers . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMiddleware ( it , Ġphase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwith Middle wares ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ers : ĠCollection < Observable Transformer < Action , ĠAction >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphase : ĠInt Ġ= ĠMiddleware . PHASE _ AFTER _ STATE _ CHANGED ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . middleware . addAll ( transformers . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMiddleware ( it , Ġphase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsubscribe Immediate ly (): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . subscribe Immediate ly Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġerror Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : Ġ( Throwable ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . error Callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġextra Transformer Observable s Ob t ainer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction : Ġ(( Observable < Action >) Ġ-> ĠArray < Observable < out Ġorg . reactor x . presenter . model . Action >> )? ĊĠĠĠĠĠĠĠ Ġ): ĠBuilder < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . extra Transformer Observable s Ob t ainer Ġ= Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠState Store < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Store ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmiddleware , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe Immediate ly , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Transformer Observable s Ob t ainer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }