package Ġorg . jetbrains . project or . client . k orge . state Ċ Ċ import Ġcom . so y wiz . k logger . Logger Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġmain Stage Ċ Ċ class ĠClient StateMachine Ġ{ ĊĊĠ Ġprivate Ġval Ġevent Queue Ġ= ĠChannel < Client Action >( capacity Ġ= ĠChannel . UN LIMIT ED ) ĊĊĠ Ġprivate Ġvar Ġcurrent State : ĠClient State Ġ= ĠClient State . Un initialized Page ĊĊĠ Ġfun Ġfire ( action : ĠClient Action ) Ġ{ ĊĠĠĠ Ġmain Stage . launch Ġ{ ĊĠĠĠĠĠ Ġevent Queue . send ( action ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġrun Main Loop () Ġ{ ĊĠĠĠ Ġmain Stage . launch Ġ{ ĊĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġevent Queue . receive () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= Ġcurrent State . consume ( action ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġt . stack Trace ToString () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" Error Ġconsuming Ġaction Ġ$ action , Ġskipping Ġthe Ġaction " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger < Client StateMachine >() ĊĠ Ġ} Ċ } Ċ