/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . ĠOpen ĠJump CO Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ*/ Ċ Ċ package Ġio . jump co . open . kf sm Ċ Ċ /** Ċ Ġ* ĠThis Ġhandler Ġwill Ġbe Ġactive Ġinside Ġthe Ġtop Ġlevel Ġof Ġthe Ġstate Machine Ġdefinition . Ċ Ġ* Ġ@ author ĠCor ne il Ġdu ĠP less is Ċ Ġ* Ġ@ sound track ĠW ol fg ang ĠA made us ĠMo z art Ċ Ġ*/ Ċ class ĠD sl StateMachine Handler < S , ĠE , ĠC , ĠA , ĠR >( private Ġval Ġf sm : ĠState Machine Builder < S , ĠE , ĠC , ĠA , ĠR >) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefines Ġan Ġexpression Ġthat Ġwill Ġdetermine Ġthe Ġinitial Ġstate Ġof Ġthe Ġstate Ġmachine Ġbased Ġon Ġthe Ġvalues Ġof Ġthe Ġcontext . ĊĠĠĠĠ Ġ* Ġ@ param Ġderive InitialState ĠA Ġlambda Ġexpression Ġreceiving Ġcontext : C Ġand Ġreturning Ġstate ĠS . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠinitialState ( derive InitialState : ĠState Query < C , ĠS >): ĠD sl StateMachine Handler < S , ĠE , ĠC , ĠA , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġf sm . initialState ( derive InitialState ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdefault InitialState : ĠS ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġf sm . default InitialState ĊĠĠĠĠĠĠĠ Ġset ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf sm . default InitialState Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġfor Ġa Ġlist Ġof Ġpairs Ġwith Ġstate Ġand Ġmap Ġname Ġthat Ġwill Ġbe Ġpushed Ġand Ġthe Ġlast Ġentry Ġwill Ġbe Ġpop ped Ġand Ġbecome Ġthe Ġcurrent Ġmap . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġrequired Ġwhen Ġusing Ġstate Ġmachine Ġwith Ġnamed Ġmaps . ĊĠĠĠĠ Ġ* ĊĊĠĠĠ Ġ``` ĊĠĠĠ Ġinitial States Ġ{ ĊĠĠĠ Ġmutable ListOf < State Map Item < Pay ing Turn st ile States >> (). apply Ġ{ ĊĠĠĠ Ġif Ġ( locked ) Ġ{ ĊĠĠĠ Ġthis . add ( Pay ing Turn st ile States . LOCK ED Ġto Ġ" default ") ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġthis . add ( Pay ing Turn st ile States . UNLOCK ED Ġto Ġ" default ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( coins Ġ> Ġ 0 ) Ġ{ ĊĠĠĠ Ġthis . add ( Pay ing Turn st ile States . CO INS Ġto Ġ" coins ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ``` ĊĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinitial States ( derive Initial Map : ĠState Map Query < C , ĠS >): ĠD sl StateMachine Handler < S , ĠE , ĠC , ĠA , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġf sm . initial States ( derive Initial Map ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinvariant ( message : ĠString , Ġcondition : ĠCondition < C >): ĠD sl StateMachine Handler < S , ĠE , ĠC , ĠA , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġf sm . in variant ( message , Ġcondition ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefines Ġan Ġaction Ġthat Ġwill Ġbe Ġinvoked Ġafter Ġa Ġtransition Ġto Ġa Ġnew Ġstate . ĊĠĠĠĠ Ġ* ĠAny Ġexceptions Ġthrown Ġby Ġthe Ġaction Ġwill Ġbe Ġignored . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon StateChange ( action : ĠState Change Action < C , ĠS >) Ġ{ ĊĠĠĠĠĠĠĠ Ġf sm . after StateChange ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefines Ġa Ġsection Ġfor Ġa Ġspecific Ġstate . ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent State ĠThe Ġgive Ġstate ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler ĠA Ġlambda Ġwith Ġdefinitions Ġfor Ġthe Ġgiven Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwhen State ( currentState : ĠS , Ġhandler : ĠD sl State Map EventHandler < S , ĠE , ĠC , ĠA , ĠR >. () Ġ-> ĠUnit ): ĊĠĠĠĠĠĠĠ ĠD sl State Map EventHandler < S , ĠE , ĠC , ĠA , ĠR > Ġ= ĊĠĠĠĠĠĠĠ ĠD sl State Map EventHandler ( currentState , Ġf sm . default State Map ). apply ( handler ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefines Ġa Ġsection Ġfor Ġdefault Ġbehaviour Ġfor Ġthe Ġstate Ġmachine . ĊĠĠĠĠ Ġ* Ġ@ param Ġhandler ĠA Ġlambda Ġwith Ġdefinition Ġfor Ġthe Ġdefault Ġbehaviour Ġof Ġthe Ġstate Ġmachine . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdefault ( handler : ĠD sl State Map Default EventHandler < S , ĠE , ĠC , ĠA , ĠR >. () Ġ-> ĠUnit ): ĊĠĠĠĠĠĠĠ ĠD sl State Map Default EventHandler < S , ĠE , ĠC , ĠA , ĠR > Ġ= ĊĠĠĠĠĠĠĠ ĠD sl State Map Default EventHandler ( fsm . default State Map ). apply ( handler ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcompleted Ġf sm . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild () Ġ= Ġf sm . complete () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcreates Ġa Ġnamed Ġstate map ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstate Map ( ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġthe Ġstate Ġmap . Ġ< ust Ġbe Ġunique Ġand Ġnot Ġempty ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġset Ġof Ġvalid Ġstates Ġfor Ġthe Ġstate Ġmap ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvalid States : ĠSet < S >, ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġlambda Ġto Ġconfigure Ġthe Ġstate map ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġhandler : ĠD sl State Map Handler < S , ĠE , ĠC , ĠA , ĠR >. () Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠD sl State Map Handler < S , ĠE , ĠC , ĠA , ĠR > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠD sl State Map Handler ( fsm . state Map ( name . trim (), Ġvalid States )). apply ( handler ) ĊĠĠĠ Ġ} Ċ } Ċ