module arch.node.engines.mempool_worker_environment;

import prelude open;
import arch.node.engines.shard_messages open;
import arch.node.engines.executor_messages open;
import arch.node.engines.mempool_worker_messages open;
import arch.node.types.engine_environment open;
import arch.node.types.identities open;
import arch.node.types.anoma_message as Anoma open;

type MempoolWorkerLocalState :=
  mk@{
    batch_number : BatchNumber;
    transactions
      : Map TxFingerprint (TransactionCandidate KVSKey KVSKey Executable);
    transactionEngines : Map EngineID TxFingerprint;
    locks_acquired : List (Pair EngineID KVSLockAcquiredMsg);
    seen_all_writes : TxFingerprint;
    seen_all_reads : TxFingerprint;
    execution_summaries : Map TxFingerprint ExecutorFinishedMsg;
    gensym : TxFingerprint;
  };

syntax alias MempoolWorkerMailboxState := Unit;
syntax alias MempoolWorkerTimerHandle := Unit;

MempoolWorkerEnv : Type :=
  EngineEnv
    MempoolWorkerLocalState
    MempoolWorkerMailboxState
    MempoolWorkerTimerHandle
    Anoma.Msg;

module mempool_worker_environment_example;
  
  mempoolWorkerEnv : MempoolWorkerEnv :=
    EngineEnv.mk@{
      localState :=
        MempoolWorkerLocalState.mk@{
          batch_number := 0;
          transactions := Map.empty;
          transactionEngines := Map.empty;
          locks_acquired := [];
          seen_all_writes := 0;
          seen_all_reads := 0;
          execution_summaries := Map.empty;
          gensym := 0;
        };
      mailboxCluster := Map.empty;
      acquaintances := Set.empty;
      timers := [];
    };
end;