module arch.node.engines.storage_behaviour;
import arch.node.engines.storage_messages open;
import arch.node.engines.storage_config open;
import arch.node.engines.storage_environment 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;
StorageActionArguments : Type := Unit;
StorageAction : Type :=
  Action
    StorageLocalCfg
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    StorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
StorageActionInput : Type :=
  ActionInput
    StorageLocalCfg
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    StorageActionArguments
    Anoma.Msg;
StorageActionEffect : Type :=
  ActionEffect
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
StorageActionExec : Type :=
  ActionExec
    StorageLocalCfg
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    StorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
exampleReplyAction (input : StorageActionInput) : Option StorageActionEffect :=
  TODO;
exampleReplyActionLabel : StorageActionExec :=
  ActionExec.Seq [exampleReplyAction];
StorageGuard : Type :=
  Guard
    StorageLocalCfg
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    StorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
StorageGuardOutput : Type :=
  GuardOutput
    StorageLocalCfg
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    StorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
StorageGuardEval : Type :=
  GuardEval
    StorageLocalCfg
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    StorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
exampleReplyGuard
  (trigger : StorageTimestampedTrigger)
  (cfg : StorageCfg)
  (env : StorageEnv)
  : Option StorageGuardOutput := TODO;
StorageBehaviour : Type :=
  EngineBehaviour
    StorageLocalCfg
    StorageLocalState
    StorageMailboxState
    StorageTimerHandle
    StorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
module storage_behaviour_example;
  
  exStorageBehaviour : StorageBehaviour :=
    EngineBehaviour.mk@{
      guards := GuardEval.First [exampleReplyGuard];
    };
end;