package Ġorg . re kotlin Ċ Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ /** Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ċ Ġ* Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ċ Ġ* Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ċ Ġ* Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ċ Ġ* Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ċ Ġ* Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ċ Ġ* Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ċ Ġ* Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , Ċ Ġ* ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF Ċ Ġ* ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND Ċ Ġ* ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION Ċ Ġ* ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION Ċ Ġ* ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ internal Ġtype alias ĠDispatch Action Ġ= Ġ( Action ) Ġ-> ĠUnit Ċ Ċ internal Ġtype alias ĠDispatch Effect Ġ= Ġ( Effect ) Ġ-> ĠUnit Ċ Ċ internal Ġclass ĠParent Store < State >( ĊĠĠĠ Ġprivate Ġval Ġreducer : ĠRed ucer < State >, ĊĠĠĠ Ġstate : ĠState ?, ĊĠĠĠ Ġmiddleware : ĠList < Middleware < State >> Ġ= Ġempty List (), Ġ// ĠTODO Ġthis Ġshould Ġbe Ġvar args ĊĠĠĠ Ġprivate Ġval Ġskip Repe ats : ĠBoolean Ġ= Ġtrue Ċ ) Ġ: ĠRoot Store < State > Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ state : ĠState ? Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions . forEach Ġ{ Ġit . new Values ( oldValue , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġstate : ĠState ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ state !! ĊĊĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠ Ġprivate Ġval Ġdispatch Action : ĠDispatch Action Ġ= Ġmiddleware ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( this :: default Dispatch Ġas ĠDispatch Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdispatch , Ġmiddleware Ġ-> Ġmiddleware ( this :: dispatch , Ġthis :: state )( dispatch ) Ġ}) ĊĊĠĠĠ Ġprivate Ġval Ġdispatch Effect : ĠDispatch Effect Ġ= Ġ{ Ġeffect Ġ-> ĊĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ Ġit ( effect ) Ġ} ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on Effect ( effect ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdispatch Function : ĠDispatch Function ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ{ Ġdispatch able : ĠDispatch able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dispatch able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction Ġ-> Ġdispatch Action ( dispatch able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEffect Ġ-> Ġdispatch Effect ( dispatch able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch ( dispatch able : ĠDispatch able ) Ġ= Ġdispatch Function ( dispatch able ) ĊĊĠĠĠ Ġinternal Ġval Ġsubscriptions : ĠMutable List < Subscription Box < State , ĠAny >> Ġ= ĠCopy On Write ArrayList () ĊĠĠĠ Ġinternal Ġval Ġlisteners : ĠMutable List < Listener Box <* >> Ġ= ĠCopy On Write ArrayList () ĊĊĠĠĠ Ġprivate Ġval Ġchildren : ĠMutable List < Dispatch Function > Ġ= ĠCopy On Write ArrayList () ĊĊĠĠĠ Ġoverride Ġfun Ġ< Child State > Ġchild Store ( ĊĠĠĠĠĠĠĠ Ġchild Reducer : ĠRed ucer < Child State >, ĊĠĠĠĠĠĠĠ Ġinitial Child State : ĠChild State ? ĊĠĠĠ Ġ): ĠStore < Pair < State , ĠChild State >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= ĠChild Store ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġa , Ġs Ġ-> ĠPair ( s ?. first Ġ?: Ġstate , Ġchild Reducer ( a , Ġs ?. second )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initial Child State Ġ!= Ġnull ) ĠPair ( state , Ġinitial Child State ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġchildren . add ( child . delegate Dispatch Function ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchild ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ state Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dispatch ( Re Kotlin Init ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< S Ġ: ĠSubscriber < State >> Ġsubscribe ( subscriber : ĠS ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe ( subscriber , Ġ:: state Identity ) ĊĊĠĠĠ Ġoverride Ġfun Ġ< Selected State , ĠS Ġ: ĠSubscriber < Selected State >> Ġsubscribe ( ĊĠĠĠĠĠĠĠ Ġsubscriber : ĠS , ĊĠĠĠĠĠĠĠ Ġselector : ĠSubscription < State >. () Ġ-> ĠSubscription < Selected State > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġunsubscribe ( subscriber ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Selector Ġ= Ġif Ġ( skip Repe ats ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompose ( selector , ĠSubscription < Selected State >:: skip Repe ats ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbox Ġ= ĠSubscription Box ( actual Selector , Ġsubscriber ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġeach Ġsubscriber Ġhas Ġits Ġown Ġpotentially Ġdifferent ĠSelected State Ġthat Ġdoesn 't Ġhave Ġto Ġconform Ġto ĠState Type ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġthis . subscriptions . add ( box Ġas ĠSubscription Box < State , ĠAny >) ĊĊĠĠĠĠĠĠĠ Ġthis ._ state ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbox . new Values ( null , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< Selected State > Ġunsubscribe ( subscriber : ĠSubscriber < Selected State >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġthis . subscriptions . indexOf First Ġ{ Ġit . subscriber Ġ=== Ġsubscriber Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . subscriptions . remove At ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġno Inter ru ptions Please Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġno Inter ru ptions ( work : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Inter ru ptions Please ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Re Kotlin : Concurrent Mutation Error Ġ- Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Action Ġhas Ġbeen Ġdis patched Ġwhile Ġa Ġprevious Ġaction Ġis Ġbeing Ġprocessed . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġreducer Ġis Ġdispatch ing Ġan Ġaction , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" or Ġyou Ġare Ġusing ĠRe Kotlin Ġin Ġa Ġconcurrent Ġcontext Ġ( e . g . Ġmult ith readed )." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . no Inter ru ptions Please Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġwork () ĊĠĠĠĠĠĠĠ Ġthis . no Inter ru ptions Please Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn ĠnewState ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefault Dispatch ( dispatch able : ĠDispatch able ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dispatch able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction Ġ-> Ġ_ state Ġ= Ġno Inter ru ptions Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ Ġit ( dispatch able ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer ( dispatch able , Ġ_ state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEffect Ġ-> Ġlisteners . forEach Ġ{ Ġit . on Effect ( dispatch able ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe ( listener : ĠListener < Effect >) Ġ= Ġsubscribe ( listener , Ġ:: effect Identity ) ĊĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠEffect > Ġunsubscribe ( listener : ĠListener < E >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġthis . listeners . indexOf First Ġ{ Ġit . listener Ġ=== Ġlistener Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . listeners . remove At ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠEffect > Ġsubscribe ( listener : ĠListener < E >, Ġselector : Ġ( Effect ) Ġ-> ĠE ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġunsubscribe ( listener ) ĊĊĠĠĠĠĠĠĠ Ġlisteners . add ( Listener Box ( listener , Ġselector )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġprivate Ġclass ĠLock < T > Ġ: Ġ(() Ġ-> ĠT ) Ġ-> ĠT Ġ{ Ċ // ĠĠĠ Ġprivate Ġvar Ġis Dispatch ing Ġ= Ġfalse Ċ // Ċ // ĠĠĠ Ġoverride Ġfun Ġinvoke ( work : Ġ() Ġ-> ĠT ): ĠT Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( is Dispatch ing ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Re Kotlin : Concurrent Mutation Error Ġ- Ġ" Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Action Ġhas Ġbeen Ġdis patched Ġwhile Ġa Ġprevious Ġaction Ġis Ġbeing Ġprocessed . Ġ" Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġreducer Ġis Ġdispatch ing Ġan Ġaction , Ġ" Ġ+ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" or Ġyou Ġare Ġusing ĠRe Kotlin Ġin Ġa Ġconcurrent Ġcontext Ġ( e . g . Ġmult ith readed )." Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġthis . is Dispatch ing Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġwork () Ċ // ĠĠĠĠĠĠĠ Ġthis . is Dispatch ing Ġ= Ġfalse Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn ĠnewState Ċ // ĠĠĠ Ġ} Ċ // Ġ} Ċ