package Ġio . github . y us aka 3 9 . redux kt Ċ Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġy us aka Ġon Ġ 3 / 1 5 / 1 7 . Ċ Ġ*/ Ċ Ċ type alias Ġ ĠState Subscriber < T > Ġ= Ġ( old : ĠT , Ġnew : ĠT ) Ġ-> ĠUnit Ċ Ċ class ĠStore < T Ġ: ĠState Type >( initialState : ĠT , Ġprivate Ġval Ġdelegate : ĠStore Delegate < T >) Ġ{ ĊĊĠĠĠ Ġconstructor ( initialState : ĠT , Ġreducer : ĠRed ucer < T >, Ġmiddle wares : ĠList < Middleware < T >>) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( initialState , Ġobject Ġ: ĠStore Delegate < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Reducer (): ĠRed ucer < T > Ġ= Ġreducer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Middle wares (): ĠList < Middleware < T >> Ġ= Ġmiddle wares ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġvar Ġstate : ĠT Ġby ĠDeleg ates . observable ( initialState ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠĠĠĠĠ Ġsubscribers . forEach Ġ{ Ġit ( old , Ġnew ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġsubscribers : ĠList < State Subscriber < T >> Ġ= Ġempty List () ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĊĠĠĠ Ġprivate Ġval Ġwith Lock : ĠMiddleware < T > Ġ= Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġ{ Ġdispatcher Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lock . try Lock ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegal Access Error (" Store Ġis Ġnot Ġallowed Ġmult ith readed Ġdispatch ing ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubscribe ( subscriber : ĠState Subscriber < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . subscribers . contains ( subscriber )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Trying Ġto Ġregister Ġduplicated Ġsubscriber ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . subscribers Ġ+= Ġsubscriber ĊĠĠĠĠĠĠĠ Ġsubscriber ( this . state , Ġthis . state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunsubscribe ( subscriber : ĠState Subscriber < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . subscribers Ġ-= Ġsubscriber ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ dispatch : Ġ( Action ) Ġ-> ĠUnit Ġ= Ġ( this . delegate . get Middle wares () Ġ+ Ġwith Lock ). fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġaction : ĠAction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġthis . delegate . get Reducer ()( action , Ġthis . state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ Ġacc , Ġmiddle Ware Ġ-> ĊĠĠĠĠĠĠĠ Ġmiddle Ware ( this . state )( acc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ._ dispatch ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch ( creator : ĠAction Creator < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . dispatch ( creator ( this . state , Ġthis )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch ( async Creator : ĠAsync Action Creator < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . dispatch ( async Creator , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispatch ( async Creator : ĠAsync Action Creator < T >, Ġcallback : Ġ(( T ) Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠĠĠ Ġasync Creator ( this . state , Ġthis ) Ġ{ Ġcreator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dispatch ( creator ( this . state , Ġthis )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke ( this . state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠStore Delegate < T Ġ: ĠState Type > Ġ{ ĊĠĠĠ Ġfun Ġget Reducer (): ĠRed ucer < T > ĊĠĠĠ Ġfun Ġget Middle wares (): ĠList < Middleware < T >> Ċ }