package Ġcom . at th apon . mar co h redux Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . annotations . Check ReturnValue Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġio . reactivex . subjects . Replay Subject Ċ Ċ interface ĠAction Ċ Ċ interface ĠState Ċ Ċ interface ĠRed ucer < S Ġ: ĠState > Ġ{ ĊĊĠĠĠ Ġfun Ġreduce ( currentState : ĠS , Ġaction : ĠAction ): ĠS Ċ } Ċ Ċ interface ĠMiddleware < S Ġ: ĠState > Ġ{ ĊĊĠĠĠ Ġfun Ġperform Before Reduc ing State ( currentState : ĠS , Ġaction : ĠAction ) Ġ{} ĊĊĠĠĠ Ġfun Ġperform After Reduc ing State ( action : ĠAction , Ġnext State : ĠS ) Ġ{} Ċ } Ċ Ċ interface ĠStore Type < S Ġ: ĠState > Ġ{ ĊĊĠĠĠ Ġval Ġstates : ĠObservable < Pair < S , ĠAction >> ĊĊĠĠĠ Ġval Ġin distinct States : ĠObservable < Pair < S , ĠAction >> ĊĊĠĠĠ Ġvar Ġreplace Reducer : Ġ( S , ĠAction ) Ġ-> ĠS ĊĊĠĠĠ Ġfun Ġdispatch ( action : ĠAction ) ĊĊĠĠĠ Ġfun Ġdispatch ( actions : ĠObservable < out ĠAction >): ĠDis posable ĊĊĠĠĠ Ġfun Ġadd Middleware ( middleware : ĠMiddleware < S >) ĊĊĠĠĠ Ġfun Ġremove Middleware ( middleware : ĠMiddleware < S >): ĠBoolean Ċ } Ċ Ċ class ĠStore < S Ġ: ĠState >( ĊĠĠĠ ĠinitialState : ĠS , ĊĠĠĠ Ġreducer : ĠRed ucer < S >, ĊĠĠĠ Ġdefault Scheduler : ĠScheduler Ġ= ĠS chedulers . single () Ċ ) Ġ: ĠStore Type < S > Ġ{ ĊĊĠĠĠ Ġobject ĠNo Action Ġ: ĠAction ĊĊĠĠĠ Ġprivate Ġvar Ġaction Subject Ġ= ĠRe play Subject . create < Action >() ĊĊĠĠĠ Ġoverride Ġval Ġstates : ĠObservable < Pair < S , ĠAction >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ states . distinct Until Changed () ĊĊĠĠĠ Ġoverride Ġval Ġin distinct States : ĠObservable < Pair < S , ĠAction >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ states ĊĊĠĠĠ Ġprivate Ġval Ġ_ states : ĠObservable < Pair < S , ĠAction >> ĊĊĠĠĠ Ġprivate Ġval Ġmiddle wares Ġ= Ġmutable ListOf < Middleware < S >>() ĊĊĠĠĠ Ġ// ĠBy Ġdefault , Ġthis Ġis Ġdoing Ġnothing , Ġjust Ġpassing Ġthe Ġreduced Ġstate ĊĠĠĠ Ġoverride Ġvar Ġreplace Reducer : Ġ( S , ĠAction ) Ġ-> ĠS Ġ= Ġ{ Ġreduced State , Ġ_ Ġ-> Ġreduced State Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ states Ġ= Ġaction Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. scan ( initialState Ġto ĠNo Action Ġas ĠAction ) Ġ{ Ġ( state , Ġ_ ), Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmiddle wares . on Each Ġ{ Ġit . perform Before Reduc ing State ( state , Ġaction ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreduced State Ġ= Ġreducer . reduce ( state , Ġaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext State Ġ= Ġreplace Reducer ( reduced State , Ġaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext State Ġto Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Next Ġ{ Ġnext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( next State , Ġlatest Action ) Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmiddle wares . on Each Ġ{ Ġit . perform After Reduc ing State ( latest Action , Ġnext State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( default Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replay ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. auto Connect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ") ĊĠĠĠ Ġoverride Ġfun Ġdispatch ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Subject . onNext ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġoverride Ġfun Ġdispatch ( actions : ĠObservable < out ĠAction >): ĠDis posable Ġ= ĊĠĠĠĠĠĠĠ Ġactions . subscribe ( action Subject :: onNext ) ĊĊĠĠĠ Ġoverride Ġfun Ġadd Middleware ( middleware : ĠMiddleware < S >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmiddle wares . add ( middleware ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Middleware ( middleware : ĠMiddleware < S >) Ġ= Ġmiddle wares . remove ( middleware ) Ċ }