@ file : Suppress (" D uplicated Code ") Ċ Ċ import ĠWater Action . Ch ill Ċ import ĠWater Action . Dr ink Ċ import ĠWater Action . Fill Ċ import ĠWater Action . Heat Ċ import ĠWater State . Empty Ċ import ĠWater State . Ice Ċ import ĠWater State . Liquid Ċ import ĠWater State . Steam Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . drop Ċ import Ġkotlinx . coroutines . join All Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġme . ang ry byte . k ssm . api . Action Ċ import Ġme . ang ry byte . k ssm . dsl . moves Ċ import Ġme . ang ry byte . k ssm . dsl . state Machine Ċ import Ġme . ang ry byte . k ssm . dsl . to Ċ import Ġjava . util . concurrent . Executors Ċ Ċ fun Ġmain () Ġ= Ġrun Blocking Ġ{ ĊĊĠ Ġ// ĠNOTE : Ġin fix Ġfunction Ġ' to ' Ġcomes Ġfrom Ġthe ĠDSL Ġpackage ĊĊĠ Ġval Ġsm Ġ= Ġstate Machine Ġ{ ĊĊĠĠĠ Ġmappings ( ĊĠĠĠĠĠ ĠHe at Ġmoves ĠI ce Ġto ĠLi quid , ĊĠĠĠĠĠ ĠHe at Ġmoves ĠSteam Ġto ĠSteam , ĊĠĠĠĠĠ ĠHe at Ġmoves ĠLi quid Ġto ĠSteam , ĊĊĠĠĠĠĠ ĠCh ill Ġmoves ĠI ce Ġto ĠI ce , ĊĠĠĠĠĠ ĠCh ill Ġmoves ĠSteam Ġto ĠLi quid , ĊĠĠĠĠĠ ĠCh ill Ġmoves ĠLi quid Ġto ĠI ce , ĊĊĠĠĠĠĠ ĠD rink Ġmoves ĠLi quid Ġto ĠEmpty , ĊĠĠĠĠĠ ĠFill Ġmoves ĠEmpty Ġto ĠLi quid ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠinitialState Ġ= ĠEmpty ĊĊĠ Ġ} ĊĊĠ Ġ// ĠNOTE : Ġwe Ġwill Ġsuspend Ġto Ġdifferent Ġthreads Ġto Ġbe Ġable Ġto Ġcontinue ; ĊĠ Ġ// Ġaltern atively , Ġyou Ġcan Ġset Ġdispatch Ġthreads Ġto Ġthe Ġstate Ġmachine Ġdirectly Ġvia Ġthe ĠAPI ĊĊĠ Ġval Ġcustom Dispatcher Ġ= ĠExec utors . new Fixed ThreadPool ( 2 ). as Coroutine Dispatcher () Ġ// Ġ 2 Ġ- Ġtransitions Ġ+ Ġerrors ĊĠ Ġval Ġtransitions Job Ġ= Ġlaunch ( custom Dispatcher ) Ġ{ ĊĠĠĠ Ġ// Ġremember , ĠFlow Ġis Ġcon fl ated ĊĠĠĠ Ġsm . transitions ĊĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠ Ġ. collect Ġ{ Ġprintln (" Detected Ġchange : Ġ$ it \ n ") Ġ} ĊĠ Ġ} ĊĠ Ġval Ġerrors Job Ġ= Ġlaunch ( custom Dispatcher ) Ġ{ ĊĠĠĠ Ġ// Ġremember , ĠFlow Ġis Ġcon fl ated ĊĠĠĠ Ġsm . errors ĊĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠ Ġ. collect Ġ{ ĠSystem . err . println (" Invalid Ġrequest : Ġ$ it \ n ") Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠNOTE : Ġwe Ġmove Ġthrough Ġstates Ġone Ġafter Ġthe Ġother , Ġbut Ġnormally Ġyou Ġwould Ġnot Ġdo Ġthis ; ĊĠ Ġ// Ġinstead , Ġyou Ġwould Ġreact Ġto Ġthe Ġactual Ġoutside Ġevents Ġand Ġsend Ġonly Ġone Ġinput / action Ġat Ġa Ġtime ĊĊĠ Ġval Ġtransition Tasks Ġ= Ġmutable ListOf < Job >() ĊĠ Ġfun Ġmove To ( a : ĠAction <* >) Ġ= Ġtransition Tasks . add ( sm . transition ( a )) ĊĊĠ Ġmove To ( Fill ) Ġ Ġ// Ġbecomes Ġ' Liquid ' ĊĠ Ġmove To ( Ch ill ) Ġ// Ġbecomes Ġ' Ice ' ĊĠ Ġmove To ( Dr ink ) Ġ// Ġfails ĊĠ Ġmove To ( Heat ) Ġ Ġ// Ġbecomes Ġ' Liquid ' ĊĠ Ġmove To ( Heat ) Ġ Ġ// Ġbecomes Ġ' Steam ' ĊĠ Ġmove To ( Dr ink ) Ġ// Ġfails ĊĠ Ġmove To ( Ch ill ) Ġ// Ġbecomes Ġ' Liquid ' ĊĠ Ġmove To ( Dr ink ) Ġ// Ġbecomes Ġ' Empty ' ĊĠ Ġmove To ( Dr ink ) Ġ// Ġfails ĊĊĠ Ġ// ĠNOTE : Ġwe Ġwait Ġfor Ġcompletion Ġhere Ġand Ġcancel Ġthe Ġlisteners ĊĊĠ Ġtransition Tasks . join All () ĊĠ Ġtransitions Job . cancel () ĊĠ Ġerrors Job . cancel () ĊĠ Ġcustom Dispatcher . close () ĊĠ Ġsm . finish () Ġ// Ġkill Ġthe Ġstate Ġmachine Ċ Ċ }