package Ġcom . bad oo . mv ic ore . feature Ċ Ċ import Ġcom . bad oo . binder . middleware . wrap With Middleware Ċ import Ġcom . bad oo . mv ic ore . element . Actor Ċ import Ġcom . bad oo . mv ic ore . element . Bootstrap per Ċ import Ġcom . bad oo . mv ic ore . element . News Publisher Ċ import Ġcom . bad oo . mv ic ore . element . Post Processor Ċ import Ġcom . bad oo . mv ic ore . element . Reducer Ċ import Ġcom . bad oo . mv ic ore . element . Wish ToAction Ċ import Ġcom . bad oo . mv ic ore . extension . Same Thread Verifier Ċ import Ġcom . bad oo . mv ic ore . extension . as Consumer Ċ import Ġcom . bad oo . mv ic ore . extension . observe On Nullable Ċ import Ġcom . bad oo . mv ic ore . extension . serialize If NotNull Ċ import Ġcom . bad oo . mv ic ore . extension . subscribe On Nullable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Source Ċ import Ġio . reactivex . Observer Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . functions . Consumer Ċ import Ġio . reactivex . rx kotlin . plus Assign Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġio . reactivex . subjects . Subject Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ open Ġclass ĠBase Feature < Wish Ġ: ĠAny , Ġin ĠAction Ġ: ĠAny , Ġin ĠEffect Ġ: ĠAny , ĠState Ġ: ĠAny , ĠNews Ġ: ĠAny >( ĊĠĠĠ ĠinitialState : ĠState , ĊĠĠĠ Ġbootstrap per : ĠBootstrap per < Action >? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġwish ToAction : ĠW ish ToAction < Wish , ĠAction >, ĊĠĠĠ Ġactor : ĠActor < State , ĠAction , ĠEffect >, ĊĠĠĠ Ġreducer : ĠRed ucer < State , ĠEffect >, ĊĠĠĠ Ġpost Processor : ĠPost Processor < Action , ĠEffect , ĠState >? Ġ= Ġnull , ĊĠĠĠ Ġnews Publisher : ĠNews Publisher < Action , ĠEffect , ĠState , ĠNews >? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġs chedulers : ĠFeature Schedulers ? Ġ= Ġnull Ċ ) Ġ: ĠAsync Feature < Wish , ĠState , ĠNews > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġthread Verifier Ġby Ġlazy Ġ{ ĠSame Thread Verifier () Ġ} ĊĠĠĠ Ġprivate Ġval Ġaction Subject Ġ= ĠPublish Subject . create < Action >(). serialize If NotNull ( schedul ers ) ĊĠĠĠ Ġ// Ġstore Ġlast Ġstate Ġto Ġmake Ġbest Ġeffort Ġto Ġreturn Ġit Ġin ĠgetState () ĊĠĠĠ Ġprivate Ġval Ġlast State Ġ= ĠAtomic Reference < State >( initialState ) ĊĠĠĠ Ġprivate Ġval Ġstate Subject Ġ= ĠBehavior Subject . create Default ( initialState ). serialize If NotNull ( schedul ers ) ĊĠĠĠ Ġprivate Ġval Ġnews Subject Ġ= ĠPublish Subject . create < News >(). serialize If NotNull ( schedul ers ) ĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġpost Processor Wrapper Ġ= Ġpost Processor ?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠPost Processor Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Processor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Subject ĊĠĠĠĠĠĠĠ Ġ). wrap With Middleware ( wrapper Of Ġ= Ġpost Processor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġnews Publisher Wrapper Ġ= Ġnews Publisher ?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠNews Publisher Wrapper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnews Publisher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnews Subject ĊĠĠĠĠĠĠĠ Ġ). wrap With Middleware ( wrapper Of Ġ= Ġnews Publisher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreducer Wrapper Ġ= ĠRed ucer Wrapper ( ĊĠĠĠĠĠĠĠ Ġreducer , ĊĠĠĠĠĠĠĠ Ġstate Subject , ĊĠĠĠĠĠĠĠ Ġpost Processor Wrapper , ĊĠĠĠĠĠĠĠ Ġnews Publisher Wrapper ĊĠĠĠ Ġ). wrap With Middleware ( wrapper Of Ġ= Ġreducer ) ĊĊĠĠĠ Ġprivate Ġval Ġactor Wrapper Ġ= ĠActor Wrapper ( ĊĠĠĠĠĠĠĠ Ġdis pos ables , ĊĠĠĠĠĠĠĠ Ġactor , ĊĠĠĠĠĠĠĠ Ġstate Subject , ĊĠĠĠĠĠĠĠ Ġreducer Wrapper , ĊĠĠĠĠĠĠĠ Ġs chedulers ?. feature Scheduler , ĊĠĠĠĠĠĠĠ Ġlazy Ġ{ Ġthread Verifier Ġ} Ġ// Ġpass Ġas Ġlazy Ġto Ġnot Ġinitialize Ġhere ĊĠĠĠ Ġ). wrap With Middleware ( wrapper Of Ġ= Ġactor ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( schedul ers ?. feature Scheduler Ġ== Ġnull ) Ġthread Verifier ĊĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġstate Subject . subscribe Ġ{ Ġlast State . set ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġactor Wrapper ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġreducer Wrapper ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġpost Processor Wrapper ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġnews Publisher Wrapper ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On Nullable ( schedul ers ?. feature Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġinvoke Actor ( state , Ġit ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bootstrap per Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Consumer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap With Middleware ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper Of Ġ= Ġbootstrap per , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpostfix Ġ= Ġ" output " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. defer Ġ{ Ġbootstrap per () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On Nullable ( schedul ers ?. feature Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On Nullable ( schedul ers ?. feature Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġoutput . accept ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġbackground States : ĠObservable < State > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate Subject ĊĊĠĠĠ Ġoverride Ġval Ġbackground News : ĠObservable < News > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnews Subject ĊĊĠĠĠ Ġoverride Ġval Ġstate : ĠState ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlast State . get () ĊĊĠĠĠ Ġoverride Ġval Ġnews : ĠObservable Source < News > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnews Subject . observe On Nullable ( schedul ers ?. observation Scheduler ) ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe ( observer : ĠObserver < in ĠState >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On Nullable ( schedul ers ?. observation Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġaccept ( wish : ĠW ish ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġwish ToAction . invoke ( wish ) ĊĠĠĠĠĠĠĠ Ġaction Subject . onNext ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis pos ables . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Disposed (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġdis pos ables . is Disposed ĊĊĠĠĠ Ġprivate Ġfun Ġinvoke Actor ( state : ĠState , Ġaction : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Disposed ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( actor Wrapper Ġis ĠActor Wrapper < State , ĠAction , Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere 's Ġno Ġmiddleware Ġaround Ġit , Ġso Ġwe Ġcan Ġoptim ise Ġhere Ġby Ġnot Ġcreating Ġany Ġextra Ġobjects ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactor Wrapper . process Action ( state , Ġaction ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġare Ġmiddle wares Ġaround Ġit , Ġand Ġwe Ġmust Ġtreat Ġit Ġas ĠConsumer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactor Wrapper . accept ( Pair ( state , Ġaction )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġoperator Ġfun ĠComposite Disposable . plus Assign ( any : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( any Ġis ĠDis posable ) Ġadd ( any ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠActor Wrapper < State Ġ: ĠAny , ĠAction Ġ: ĠAny , ĠEffect Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdis pos ables : ĠComposite Disposable , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactor : ĠActor < State , ĠAction , ĠEffect >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstate Subject : ĠSubject < State >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreducer Wrapper : ĠConsumer < Triple < State , ĠAction , ĠEffect >>, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfeature Scheduler : ĠScheduler ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġthread Verifier : ĠLazy < Same Thread Verifier > ĊĠĠĠ Ġ) Ġ: ĠConsumer < Pair < State , ĠAction >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġrecord - playback Ġentry Ġpoint ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( t : ĠPair < State , ĠAction >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( state , Ġaction ) Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Action ( state , Ġaction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġprocess Action ( state : ĠState , Ġaction : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis pos ables . is Disposed ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdis posable : ĠDis posable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. invoke ( state , Ġaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On Nullable ( feature Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġdis pos ables Ġmanually Ġbecause ĠComposite Disposable Ġdoes Ġnot Ġdo Ġit Ġautomatically Ġproducing Ġmemory Ġle aks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġnull Ġas Ġit Ġmight Ġbe Ġdisposed Ġinstant ly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable ?. let ( dis pos ables :: remove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġeffect Ġ-> Ġinvoke Reducer ( action , Ġeffect ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDis posable Ġmight Ġbe Ġalready Ġdisposed Ġin Ġcase Ġof Ġno Ġscheduler Ġ+ ĠObservable . just ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dis posable . is Disposed ) Ġdis pos ables Ġ+= Ġdis posable ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinvoke Reducer ( action : ĠAction , Ġeffect : ĠEffect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis pos ables . is Disposed ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Subject Ġis ĠBehavior Subject < State >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( state Subject . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġserialized Ġwait Ġfor Ġasync Ġprocesses Ġto Ġcomplete Ġand Ġget Ġthe Ġactual Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġblocking First Ġis Ġhappening Ġon Ġthe Ġfeature Scheduler Ġin Ġthis Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Subject . blocking First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Verifier . value . verify () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reducer Wrapper Ġis ĠRed ucer Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere 's Ġno Ġmiddleware Ġaround Ġit , Ġso Ġwe Ġcan Ġoptim ise Ġhere Ġby Ġnot Ġcreating Ġany Ġextra Ġobjects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer Wrapper . process Effect ( state , Ġaction , Ġeffect ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġare Ġmiddle wares Ġaround Ġit , Ġand Ġwe Ġmust Ġtreat Ġit Ġas ĠConsumer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer Wrapper . accept ( Triple ( state , Ġaction , Ġeffect )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRed ucer Wrapper < State Ġ: ĠAny , ĠAction Ġ: ĠAny , ĠEffect Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreducer : ĠRed ucer < State , ĠEffect >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstates : ĠSubject < State >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpost Processor Wrapper : ĠConsumer < Triple < Action , ĠEffect , ĠState >> ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnews Publisher Wrapper : ĠConsumer < Triple < Action , ĠEffect , ĠState >> ? ĊĠĠĠ Ġ) Ġ: ĠConsumer < Triple < State , ĠAction , ĠEffect >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġrecord - playback Ġentry Ġpoint ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( t : ĠTrip le < State , ĠAction , ĠEffect >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( state , Ġaction , Ġeffect ) Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Effect ( state , Ġaction , Ġeffect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġprocess Effect ( state : ĠState , Ġaction : ĠAction , Ġeffect : ĠEffect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġreducer . invoke ( state , Ġeffect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . onNext ( newState ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Post Processor ( action , Ġeffect , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke News Publisher ( action , Ġeffect , ĠnewState ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinvoke Post Processor ( action : ĠAction , Ġeffect : ĠEffect , Ġstate : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Processor Wrapper ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( post Processor Wrapper Ġis ĠPost Processor Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere 's Ġno Ġmiddleware Ġaround Ġit , Ġso Ġwe Ġcan Ġoptim ise Ġhere Ġby Ġnot Ġcreating Ġany Ġextra Ġobjects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Processor Wrapper . post Process ( action , Ġeffect , Ġstate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġare Ġmiddle wares Ġaround Ġit , Ġand Ġwe Ġmust Ġtreat Ġit Ġas ĠConsumer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Processor Wrapper . accept ( Triple ( action , Ġeffect , Ġstate )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinvoke News Publisher ( action : ĠAction , Ġeffect : ĠEffect , Ġstate : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnews Publisher Wrapper ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( news Publisher Wrapper Ġis ĠNews Publisher Wrapper < Action , ĠEffect , ĠState , Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere 's Ġno Ġmiddleware Ġaround Ġit , Ġso Ġwe Ġcan Ġoptim ise Ġhere Ġby Ġnot Ġcreating Ġany Ġextra Ġobjects ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnews Publisher Wrapper . publish News ( action , Ġeffect , Ġstate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġare Ġmiddle wares Ġaround Ġit , Ġand Ġwe Ġmust Ġtreat Ġit Ġas ĠConsumer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnews Publisher Wrapper . accept ( Triple ( action , Ġeffect , Ġstate )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPost Processor Wrapper < Action Ġ: ĠAny , ĠEffect Ġ: ĠAny , ĠState Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpost Processor : ĠPost Processor < Action , ĠEffect , ĠState >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactions : ĠSubject < Action > ĊĠĠĠ Ġ) Ġ: ĠConsumer < Triple < Action , ĠEffect , ĠState >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġrecord - playback Ġentry Ġpoint ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( t : ĠTrip le < Action , ĠEffect , ĠState >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( action , Ġeffect , Ġstate ) Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Process ( action , Ġeffect , Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpost Process ( action : ĠAction , Ġeffect : ĠEffect , Ġstate : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Processor . invoke ( action , Ġeffect , Ġstate )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactions . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠNews Publisher Wrapper < Action Ġ: ĠAny , ĠEffect Ġ: ĠAny , ĠState Ġ: ĠAny , ĠNews Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnews Publisher : ĠNews Publisher < Action , ĠEffect , ĠState , ĠNews >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnews : ĠSubject < News > ĊĠĠĠ Ġ) Ġ: ĠConsumer < Triple < Action , ĠEffect , ĠState >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġrecord - playback Ġentry Ġpoint ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( t : ĠTrip le < Action , ĠEffect , ĠState >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( action , Ġeffect , Ġstate ) Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish News ( action , Ġeffect , Ġstate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpublish News ( action : ĠAction , Ġeffect : ĠEffect , Ġstate : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnews Publisher . invoke ( action , Ġeffect , Ġstate )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnews . onNext ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ