package Ġcom . episode 6 . redux Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . Channel . Factory . UN LIMIT ED Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . launch Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġnew Ġ[ Store Flow ], Ġa Ġredux Ġstore Ġbacked Ġby Ġa Ġ[ kotlin x . coroutines . flow . State Flow ] Ċ Ġ*/ Ċ @ Suppress (" FunctionName ") Ġfun Ġ< State Ġ: ĠAny ?> ĠStore Flow ( ĊĠ Ġscope : ĠCor outine Scope , ĊĠ Ġinitial Value : ĠState , ĊĠ Ġreducer : ĠRed ucer < State >, ĊĠ Ġmiddle wares : ĠList < Middleware < State >> Ġ= Ġempty List (), Ċ ): ĠStore Flow < State > Ġ= ĠStore Flow Impl ( ĊĠ Ġscope Ġ= Ġscope , ĊĠ ĠinitialState Ġ= Ġinitial Value , ĊĠ Ġreducer Ġ= Ġreducer , ĊĠ Ġmiddle wares Ġ= Ġmiddle wares , Ċ ) Ċ Ċ private Ġclass ĠStore Flow Impl < T Ġ: ĠAny ? >( ĊĠ Ġscope : ĠCor outine Scope , ĊĠ Ġoverride Ġval ĠinitialState : ĠT , ĊĠ Ġreducer : ĠRed ucer < T >, ĊĠ Ġmiddle wares : ĠList < Middleware < T >>, ĊĠ Ġprivate Ġval Ġstate Flow : ĠMutable State Flow < T > Ġ= ĠMutable State Flow ( initialState ) Ċ ) Ġ: ĠStore Flow < T >, ĠFlow < T > Ġby Ġstate Flow Ġ{ ĊĊĠ Ġprivate Ġval Ġaction Channel : ĠChannel < Action > Ġ= ĠChannel ( capacity Ġ= ĠUN LIMIT ED ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠ Ġval Ġreduce : ĠDispatch Ġ= Ġmiddle wares . fold Right ( ĊĠĠĠĠĠĠĠ Ġinitial Ġ= Ġ{ Ġaction Ġ-> Ġstate Flow . value Ġ= Ġstate Flow . value . reducer ( action ) Ġ}, ĊĠĠĠĠĠĠĠ Ġoperation Ġ= Ġ{ Ġmiddleware , Ġnext Ġ-> Ġwith ( middleware ) Ġ{ Ġinterf ere ( this @ Store Flow Impl , Ġnext ) Ġ} Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( action Ġin Ġaction Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreduce ( action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Channel . close () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġval Ġstate : ĠT Ġget () Ġ= Ġstate Flow . value ĊĊĠ Ġoverride Ġfun Ġdispatch ( action : ĠAction ) Ġ{ ĊĠĠĠ Ġaction Channel . try Send ( action ) ĊĠ Ġ} Ċ } Ċ