package Ġcom . inst ac art . formula Ċ Ċ import Ġcom . inst ac art . formula . internal . Delegate Transition Context Ċ import Ġcom . inst ac art . formula . internal . combine Ċ import Ġcom . inst ac art . formula . internal . to Result Ċ Ċ /** Ċ Ġ* ĠTransition Ġcontext Ġprovides Ġthe Ġcurrent Ġ[ input ], Ġthe Ġcurrent Ġ[ state ] Ġand Ġutilities Ġto Ġhelp Ċ Ġ* Ġcreate Ġ[ Transition . Result ] Ġwithin Ġ[ Transition . to Result ]. Ċ Ġ*/ Ċ interface ĠTransition Context < out ĠInput , ĠState > Ġ{ ĊĊĠĠĠ Ġval Ġinput : ĠInput ĊĠĠĠ Ġval Ġstate : ĠState ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġresult Ġthat Ġindicates Ġto Ġdo Ġnothing Ġas Ġpart Ġof Ġthis Ġevent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnone (): ĠTransition . Result < Nothing > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTransition . Result . None ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġresult Ġthat Ġcontains Ġa Ġnew Ġ[ State ] Ġobject Ġand Ġoptional Ġ[ effects ][ Effects ] ĊĠĠĠĠ Ġ* Ġthat Ġwill Ġbe Ġexecuted Ġafter Ġthe Ġstate Ġis Ġupdated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< State > Ġtransition ( ĊĠĠĠĠĠĠĠ Ġstate : ĠState , ĊĠĠĠĠĠĠĠ Ġeffects : ĠEffect s ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠTransition . Result . State ful < State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTransition . Result . State ful ( state , Ġeffects ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġresult Ġthat Ġrequests Ġ[ effects ][ Effects ] Ġto Ġbe Ġexecuted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtransition ( ĊĠĠĠĠĠĠĠ Ġeffects : ĠEffect s ĊĠĠĠ Ġ): ĠTransition . Result . Only Effects Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTransition . Result . Only Effects ( effects ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeleg ates Ġto Ġanother Ġ[ Transition ] Ġto Ġprovide Ġthe Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< Event > Ġdelegate ( transition : ĠTransition < Input , ĠState , ĠEvent >, Ġevent : ĠEvent ): ĠTransition . Result < State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransition . run Ġ{ Ġto Result ( event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeleg ates Ġto Ġanother Ġ[ Transition ] Ġthat Ġhas Ġ[ Unit ] Ġevent Ġtype Ġto Ġprovide Ġthe Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelegate ( transition : ĠTransition < Input , ĠState , ĠUnit >): ĠTransition . Result < State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdelegate ( transition , ĠUnit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġused Ġto Ġchain Ġmultiple Ġtransitions Ġtogether . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< Event > ĠTransition . Result < State >. and Then ( ĊĠĠĠĠĠĠĠ Ġtransition : ĠTransition < Input , ĠState , ĠEvent >, ĊĠĠĠĠĠĠĠ Ġevent : ĠEvent ĊĠĠĠ Ġ): ĠTransition . Result < State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransition . Result . None Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition . to Result ( this @ Transition Context , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTransition . Result . Only Effects Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombine ( this , Ġtransition . to Result ( this @ Transition Context , Ġevent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTransition . Result . State ful Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombine ( this , Ġtransition . to Result ( Delegate Transition Context ( input , Ġthis . state ), Ġevent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġused Ġto Ġchain Ġmultiple Ġtransitions Ġtogether . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠTransition . Result < State >. and Then ( ĊĠĠĠĠĠĠĠ Ġtransition : ĠTransition < Input , ĠState , ĠUnit >, ĊĠĠĠ Ġ): ĠTransition . Result < State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġand Then ( transition , ĠUnit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġto Ġchain Ġupdated Ġstate Ġwith Ġanother Ġtransition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< Event > ĠState . and Then ( ĊĠĠĠĠĠĠĠ Ġtransition : ĠTransition < Input , ĠState , ĠEvent >, ĊĠĠĠĠĠĠĠ Ġevent : ĠEvent ĊĠĠĠ Ġ): ĠTransition . Result < State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransition ( this ). and Then ( transition , Ġevent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġto Ġchain Ġupdated Ġstate Ġwith Ġanother Ġtransition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠState . and Then ( transition : ĠTransition < Input , ĠState , ĠUnit >): ĠTransition . Result < State > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransition ( this ). and Then ( transition ) ĊĠĠĠ Ġ} Ċ } ĊĊ