package Ġspace . d _ low l . k gl sm . sl s Ċ Ċ import Ġspace . d _ low l . k gl sm . general . memory . Memory Ċ import Ġspace . d _ low l . k gl sm . general . strategy . Strategy Ċ import Ġspace . d _ low l . k gl sm . general . transition predicate . Not Predicate Ċ import Ġspace . d _ low l . k gl sm . general . transition predicate . Transition Predicate Ċ import Ġspace . d _ low l . k gl sm . general . transition predicate . Un conditional Predicate Ċ Ċ class ĠSequential Step < T , ĠU >( val Ġname : ĠString , Ġval Ġstrategy : ĠStrategy < T , ĠU >) Ġ{ ĊĠĠĠ Ġprivate Ġconstructor ( builder : ĠBuilder < T , ĠU >) Ġ: Ġthis ( builder . name !! , Ġbuilder . strategy !! ) ĊĊĠĠĠ Ġclass ĠBuilder < T , ĠU > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġstrategy : ĠStrategy < T , ĠU >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠSequential Step < T , ĠU > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( strategy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSequential Step ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSequential ĠState ĠMachine Ġbuilder Ċ Ġ* Ċ Ġ* ĠBuilds Ġa Ġsequential Ġstate Ġmachine , Ġi . e . Ġa Ġstate Ġmachine Ġthat Ġconsists Ġof Ġa Ġsequence Ġof Ġstates Ġthat Ġare Ġexecuted Ċ Ġ* Ġin Ġa Ġloop Ġuntil Ġthe Ġ[ termination Ġpredicate ][ termination Predicate ] Ġis Ġmet Ġat Ġthe Ġend Ġof Ġthe Ġsequence Ċ Ġ* Ċ Ġ* Ġ@ param [ T ] ĠSolution Ġentity Ġtype Ċ Ġ* Ġ@ param [ U ] ĠSolution Ġtype Ċ Ġ*/ Ċ class ĠSequential StateMachine Builder < T , ĠU > Ġ{ ĊĠĠĠ Ġvar Ġsteps : ĠMutable List < Sequential Step < T , ĠU >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġvar Ġtermination Predicate : ĠTransition Predicate < Memory < T , ĠU >> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġun conditional Predicate Ġ= ĠUn conditional Predicate () ĊĊĠĠĠ Ġinline Ġfun Ġstep ( init Step : ĠSequential Step . Builder < T , ĠU >. () Ġ-> ĠUnit ): ĠSequential Step < T , ĠU > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠSequential Step . Builder < T , ĠU >() ĊĠĠĠĠĠĠĠ Ġbuilder . init Step () ĊĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠ Ġsteps . add ( step ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstep ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild ĠSequential ĠState ĠMachine ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild (): ĠState Machine < T , ĠU > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( steps . size Ġ== Ġ 0 ) Ġthrow ĠException (" No Ġnodes Ġhave Ġbeen Ġadded ") ĊĠĠĠĠĠĠĠ Ġif Ġ( termination Predicate Ġ== Ġnull ) Ġthrow ĠException (" No Ġtermination Ġpredicate Ġspecified ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstate Machine < T , ĠU > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry point Ġ= Ġsteps . first (). name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsteps . zip With Next (). forEach Ġ{ Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġpair . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġpair . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġcurrent . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrategy Ġ= Ġcurrent . strategy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġnext . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Predicate Ġ= Ġun conditional Predicate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġsteps . last (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrategy Ġ= Ġsteps . last (). strategy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġsteps . first (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Predicate Ġ= ĠNot Predicate ( termination Predicate !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠState Machine . TERMIN ATION _ STATE _ LABEL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Predicate Ġ= Ġtermination Predicate !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠU > Ġsequential StateMachine ( init StateMachine : ĠSequential StateMachine Builder < T , ĠU >. () Ġ-> ĠUnit ): ĠState Machine < T , ĠU > Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠSequential StateMachine Builder < T , ĠU >() ĊĠĠĠ Ġbuilder . init StateMachine () ĊĠĠĠ Ġreturn Ġbuilder . build () Ċ }