package Ġio . ch thon ic . vg _ collect . data . client Ċ Ċ import Ġcom . y her iat ovy ch . red uctor . Reducer Ċ import Ġcom . y her iat ovy ch . red uctor . Store Ċ import Ġkotlinx . coroutines . experimental . ThreadPool Dispatcher Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġkotlinx . coroutines . experimental . new Single Thread Context Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġj hav atar Ġon Ġ 3 / 1 4 / 1 7 . Ċ Ġ*/ Ċ class ĠState Client < T >( app State Reducer : ĠRed ucer < T >) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ last State : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġstore : ĠStore < T > Ġ= ĠStore . create ( app State Reducer ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ publisher List : ĠMutable List < StateChange Publisher < T >> Ġ= ĠCollections . synchronized List ( mutable ListOf ()) ĊĠĠĠ Ġprivate Ġval Ġ_ persistence List : ĠMutable List < StateChange Pers ister < T >> Ġ= ĠCollections . synchronized List ( mutable ListOf ()) ĊĊĠĠĠ Ġprivate Ġval Ġpersistence Dispatcher : ĠThreadPool Dispatcher Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Single Thread Context (" persistence ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstate : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstore . state ĊĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġstore . subscribe Ġ{ Ġstate : ĠT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast State : ĠT ? Ġ= Ġ_ last State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublisher List : ĠList < StateChange Publisher < T >> Ġ= Ġsynchronized (_ publisher List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (_ publisher List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpersist encer List : ĠList < StateChange Pers ister < T >> Ġ= Ġsynchronized (_ publisher List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (_ persistence List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpersist encer List . forEach Ġ{ Ġpers : ĠState Change Pers ister < T > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pers . should Persist ( state , Ġlast State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( persistence Dispatcher ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" do Ġpersist Ġof Ġ$ state , Ġmain Thread Ġ= Ġ${ Looper . my Looper () Ġ== ĠL ooper . get Main Looper ()}, Ġthread Ġ= Ġ${ java . lang . Thread . currentThread () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpers . persist ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher List . forEach Ġ{ Ġpub : ĠState Change Publisher < T > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pub . should Publish ( state , Ġlast State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpub . publish ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ last State Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch ( action : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstore . dispatch ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Publisher ( notifier : ĠState Change Publisher < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ publisher List . add ( notifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Publisher ( notifier : ĠState Change Publisher < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ publisher List . remove ( notifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Pers ister ( pers ister : ĠState Change Pers ister < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ persistence List . add ( pers ister ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Pers ister ( pers ister : ĠState Change Pers ister < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ persistence List . remove ( pers ister ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠState Change Publisher < in ĠS > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġshould Publish ( state : ĠS , Ġold State : ĠS ?): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun Ġpublish ( state : ĠS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠState Change Pers ister < in ĠS > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġshould Persist ( state : ĠS , Ġold State : ĠS ?): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun Ġpersist ( state : ĠS ) ĊĠĠĠ Ġ} Ċ Ċ }