module arch.node.engines.executor_environment;

import prelude open;
import arch.node.types.messages open;
import arch.node.types.identities open;
import arch.node.types.engine_environment open;
import arch.node.engines.executor_messages open;
import arch.node.types.anoma_message as Anoma open;
import arch.system.state.resource_machine.notes.nockma open;
import arch.system.state.resource_machine.notes.runnable open;
import arch.system.state.resource_machine.notes.nockma_runnable open;

syntax alias ExecutorMailboxState := Unit;

type ExecutorLocalState :=
  mk@{
    program_state : ProgramState;
    completed_reads : Map KVSKey KVSDatum;
    completed_writes : Map KVSKey KVSDatum;
  };

syntax alias ExecutorTimerHandle := Unit;

ExecutorEnv : Type :=
  EngineEnv
    ExecutorLocalState
    ExecutorMailboxState
    ExecutorTimerHandle
    Anoma.Msg;

module executor_environment_example;
  
  executorEnv : ExecutorEnv :=
    EngineEnv.mk@{
      localState :=
        ExecutorLocalState.mk@{
          program_state :=
            NockmaProgramState.mk@{
              current_noun := Noun.Atom 0;
              storage := emptyStorage;
              gas_limit := 0;
            };
          completed_reads := Map.empty;
          completed_writes := Map.empty;
        };
      mailboxCluster := Map.empty;
      acquaintances := Set.empty;
      timers := [];
    };
end;