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 KVSKey KVSDatum Executable :=
  mkMempoolWorkerLocalState@{
    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 KVSKey KVSDatum);
    gensym : TxFingerprint;
  };

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

MempoolWorkerEnv (KVSKey KVSDatum Executable : Type) : Type :=
  EngineEnv
    (MempoolWorkerLocalState KVSKey KVSDatum Executable)
    MempoolWorkerMailboxState
    MempoolWorkerTimerHandle
    (Anoma.PreMsg KVSKey KVSDatum Executable);

module mempool_worker_environment_example;
  
  mempoolWorkerEnv : MempoolWorkerEnv String String ByteString :=
    mkEngineEnv@{
      localState :=
        mkMempoolWorkerLocalState@{
          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;