module arch.node.engines.shard_environment;
import prelude open;
import arch.node.engines.shard_messages open;
import arch.node.types.engine open;
import arch.node.types.messages open;
import arch.node.types.identities open;
import arch.node.types.anoma_message as Anoma open;
syntax alias ShardMailboxState := Unit;
type ReadStatus :=
  mkReadStatus@{
    hasBeenRead : Bool;
    isEager : Bool;
    executor : EngineID;
  };
type WriteStatus KVSDatum :=
  mkWriteStatus@{
    data : Option KVSDatum;
    mayWrite : Bool;
  };
type KeyAccess KVSDatum :=
  mkKeyAccess@{
    readStatus : Option ReadStatus;
    writeStatus : Option (WriteStatus KVSDatum);
  };
type DAGStructure KVSKey KVSDatum :=
  mkDAGStructure@{
    keyAccesses : Map KVSKey (Map TxFingerprint (KeyAccess KVSDatum));
    heardAllReads : TxFingerprint;
    heardAllWrites : TxFingerprint;
  };
type ShardLocalState KVSKey KVSDatum :=
  mk@{
    dagStructure : DAGStructure KVSKey KVSDatum;
    anchors : List NarwhalBlock;
  };
syntax alias ShardTimerHandle := Unit;
ShardEnv (KVSKey KVSDatum : Type) : Type :=
  EngineEnv
    (ShardLocalState KVSKey KVSDatum)
    ShardMailboxState
    ShardTimerHandle
    Anoma.Msg;
module shard_environment_example;
  
  shardEnv : ShardEnv String String :=
    EngineEnv.mk@{
      localState :=
        ShardLocalState.mk@{
          dagStructure :=
            DAGStructure.mkDAGStructure@{
              keyAccesses := Map.empty;
              heardAllReads := 0;
              heardAllWrites := 0;
            };
          anchors := [];
        };
      mailboxCluster := Map.empty;
      acquaintances := Set.empty;
      timers := [];
    };
end;