package Ġdo hun . kim . kind a . kind a _ core Ċ Ċ import Ġdo hun . kim . kind a . kind a _ core . logging . kind a Logger Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util . concurrent . P haser Ċ Ċ @ Suppress (" New Api ") Ċ class ĠKind a < S Ġ: ĠKind a State , ĠE Ġ: ĠKind a Event , ĠSE Ġ: ĠKind a Side Effect > Ġprivate Ġconstructor ( ĊĠĠĠ Ġval ĠinitialState : ĠS , ĊĠĠĠ Ġprivate Ġval Ġreducer : ĠKind a Reducer < S , ĠE , ĠSE >, ĊĠĠĠ Ġprivate Ġval Ġside Effect Handler : ĠKind a Side Effect Handler < S , ĠE , ĠSE > ?, ĊĠĠĠ Ġprivate Ġval Ġrender : Ġ( state : ĠS ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope : ĠCor outine Scope Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġstate : ĠS Ġ= ĠinitialState ĊĊĠĠĠ Ġfun Ġintent ( event : ĠE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġkind a Logger ?. before Reduce ( state , Ġevent ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġreducer . reduce ( state , Ġevent ) ĊĊĠĠĠĠĠĠĠ Ġkind a Logger ?. after Reduce ( next . state ) ĊĊĠĠĠĠĠĠĠ Ġnext . state ?. let Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender . invoke ( state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext . side Effect ?. let Ġ{ Ġside Effect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind a Logger ?. before Handle Side Effect ( side Effect ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect Handler ?. handle ( side Effect )?. let Ġ{ Ġside Effect Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind a Logger ?. after Handle Side Effect ( side Effect Result , Ġside Effect ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent ( side Effect Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠBuilder < S Ġ: ĠKind a State , ĠE Ġ: ĠKind a Event , ĠSE Ġ: ĠKind a Side Effect >( ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠinitialState : ĠS ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġreducer : ĠKind a Reducer < S , ĠE , ĠSE >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġside Effect Handler : ĠKind a Side Effect Handler < S , ĠE , ĠSE >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġrender : Ġ(( state : ĠS ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcoroutine Scope : ĠCor outine Scope ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠinitialState ( initialState : ĠS ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġthis . initialState Ġ= ĠinitialState Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreducer ( reducer : ĠKind a Reducer < S , ĠE , ĠSE >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġthis . reducer Ġ= Ġreducer Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġside Effect Handler ( side Effect Handler : ĠKind a Side Effect Handler < S , ĠE , ĠSE >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġthis . side Effect Handler Ġ= Ġside Effect Handler Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrender ( render : Ġ( state : ĠS ) Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġthis . render Ġ= Ġrender Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcoroutine Scope ( coroutine Scope : ĠCor outine Scope ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġ{ Ġthis . coroutine Scope Ġ= Ġcoroutine Scope Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠKind a < S , ĠE , ĠSE > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( initialState ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( reducer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( render ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠKind a ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState Ġ= ĠinitialState !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreducer Ġ= Ġreducer !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Ġ= Ġrender !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect Handler Ġ= Ġside Effect Handler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ= Ġcoroutine Scope Ġ?: ĠGlobal Scope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ