module arch.node.engines.ticker_behaviour; import arch.node.engines.ticker_messages open; import arch.node.engines.ticker_config open; import arch.node.engines.ticker_environment open; import prelude open; import arch.node.types.basics open; import arch.node.types.identities open; import arch.node.types.messages open; import arch.node.types.engine open; import arch.node.types.anoma as Anoma open; type ReplyTo := mkReplyTo@{ whoAsked : Option EngineID; mailbox : Option MailboxID; }; type TickerActionArgument := | TickerActionArgumentReplyTo ReplyTo; TickerActionArguments : Type := List TickerActionArgument; TickerAction : Type := Action TickerLocalCfg TickerLocalState TickerMailboxState TickerTimerHandle TickerActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; TickerActionInput : Type := ActionInput TickerLocalCfg TickerLocalState TickerMailboxState TickerTimerHandle TickerActionArguments Anoma.Msg; TickerActionEffect : Type := ActionEffect TickerLocalState TickerMailboxState TickerTimerHandle Anoma.Msg Anoma.Cfg Anoma.Env; TickerActionExec : Type := ActionExec TickerLocalCfg TickerLocalState TickerMailboxState TickerTimerHandle TickerActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; incrementAction (input : TickerActionInput) : Option TickerActionEffect := let env := ActionInput.env input; counterValue := TickerLocalState.counter (EngineEnv.localState env); in some ActionEffect.mk@{ env := env@EngineEnv{localState := TickerLocalState.mk@{ counter := counterValue + 1; }}; msgs := []; timers := []; engines := []; }; countReplyAction (input : TickerActionInput) : Option TickerActionEffect := let cfg := ActionInput.cfg input; env := ActionInput.env input; trigger := ActionInput.trigger input; counterValue := TickerLocalState.counter (EngineEnv.localState env); in case getEngineMsgFromTimestampedTrigger trigger of | some emsg := some ActionEffect.mk@{ env := env; msgs := [ EngineMsg.mk@{ sender := getEngineIDFromEngineCfg cfg; target := EngineMsg.sender emsg; mailbox := some 0; msg := Anoma.PreMsg.MsgTicker (TickerMsg.CountReply CountReply.mkCountReply@{ counter := counterValue; }); }; ]; timers := []; engines := []; } | _ := none; incrementActionLabel : TickerActionExec := ActionExec.Seq [incrementAction]; countReplyActionLabel : TickerActionExec := ActionExec.Seq [countReplyAction]; TickerGuard : Type := Guard TickerLocalCfg TickerLocalState TickerMailboxState TickerTimerHandle TickerActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; TickerGuardOutput : Type := GuardOutput TickerLocalCfg TickerLocalState TickerMailboxState TickerTimerHandle TickerActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; TickerGuardEval : Type := GuardEval TickerLocalCfg TickerLocalState TickerMailboxState TickerTimerHandle TickerActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; incrementGuard (trigger : TimestampedTrigger TickerTimerHandle Anoma.Msg) (cfg : TickerCfg) (env : TickerEnv) : Option TickerGuardOutput := let emsg := getEngineMsgFromTimestampedTrigger trigger; in case emsg of | some EngineMsg.mk@{ msg := Anoma.PreMsg.MsgTicker TickerMsg.Increment; } := some GuardOutput.mk@{ action := incrementActionLabel; args := []; } | _ := none; countReplyGuard (trigger : TimestampedTrigger TickerTimerHandle Anoma.Msg) (cfg : TickerCfg) (env : TickerEnv) : Option TickerGuardOutput := case getEngineMsgFromTimestampedTrigger trigger of | some EngineMsg.mk@{ msg := Anoma.PreMsg.MsgTicker TickerMsg.CountRequest; } := some GuardOutput.mk@{ action := countReplyActionLabel; args := []; } | _ := none; TickerBehaviour : Type := EngineBehaviour TickerLocalCfg TickerLocalState TickerMailboxState TickerTimerHandle TickerActionArguments Anoma.Msg Anoma.Cfg Anoma.Env; tickerBehaviour : TickerBehaviour := EngineBehaviour.mk@{ guards := GuardEval.First [incrementGuard; countReplyGuard]; };