package Ġdev . y bon net ain . k intro . store Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable Shared Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ Ċ import Ġdev . y bon net ain . k intro . models . User Ċ import Ġdev . y bon net ain . k intro . repositories . Users Repository Ċ Ċ data Ġclass ĠUsers State ( ĊĠĠĠ Ġval Ġusers : ĠList < User >, ĊĠĠĠ Ġval Ġloading : ĠBoolean , Ċ ) Ġ: ĠR State Ċ Ċ sealed Ġclass ĠUsers Action Ġ: ĠAction Ġ{ ĊĠĠĠ Ġobject ĠLoad Ġ: ĠUsers Action () ĊĠĠĠ Ġdata Ġclass ĠData ( val Ġusers : ĠList < User >) Ġ: ĠUsers Action () ĊĠĠĠ Ġdata Ġclass ĠLoading ( val Ġloading : ĠBoolean ) Ġ: ĠUsers Action () ĊĠĠĠ Ġdata Ġclass ĠError ( val Ġerror : ĠException ) Ġ: ĠUsers Action () Ċ } Ċ Ċ sealed Ġclass ĠUsers Side Effect Ġ: ĠEffect Ġ{ ĊĠĠĠ Ġdata Ġclass ĠError ( val Ġerror : ĠException ) Ġ: ĠUsers Side Effect () Ċ } Ċ Ċ class ĠUsers Store Ġ: ĠStore < Users State , ĠUsers Action , ĠUsers Side Effect >, ĊĠĠĠ ĠCor outine Scope Ġby ĠCor outine Scope ( Dispatch ers . Main ), ĊĠĠĠĠĠĠĠ ĠK oin Component Ċ { ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠUsers Repository Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġstate Ġ= ĠMutable State Flow ( get InitialState ()) ĊĠĠĠ Ġprivate Ġval Ġside Effect Ġ= ĠMutable Shared Flow < Users Side Effect >() ĊĊĠĠĠ Ġoverride Ġfun Ġobserve State (): ĠState Flow < Users State > Ġ= Ġstate ĊĠĠĠ Ġoverride Ġfun Ġobserve Side Effect (): ĠFlow < Users Side Effect > Ġ= Ġside Effect ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch ( action : ĠUsers Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold State Ġ= Ġstate . value ĊĊĠĠĠĠĠĠĠ Ġval Ġnext State Ġ= Ġwhen ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUsers Action . Load Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġload Users () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUsers Action . Data Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsers State ( loading Ġ= Ġfalse , Ġusers Ġ= Ġaction . users ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUsers Action . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsers State ( loading Ġ= Ġaction . loading , Ġusers Ġ= Ġold State . users ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUsers Action . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġside Effect . emit ( Users Side Effect . Error ( action . error )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( next State Ġ!= Ġold State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . value Ġ= Ġnext State ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Users () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ( Users Action . Loading ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ( Users Action . Data ( repository . get Users ())) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ( Users Action . Error ( e )) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ( Users Action . Loading ( false )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget InitialState () Ġ= ĠUsers State ( users Ġ= Ġempty List (), Ġloading Ġ= Ġfalse ) ĊĠĠĠ Ġ} Ċ } Ċ