@@ -93,6 +93,7 @@ import Control.Monad.Class.MonadTime.SI qualified as SI
9393import Control.Monad.Class.MonadTimer
9494import Control.Monad.Class.MonadTimer.SI (TimeoutState (.. ))
9595import Control.Monad.Class.MonadTimer.SI qualified as SI
96+ import Control.Monad.Class.MonadUnique
9697import Control.Monad.Primitive qualified as Prim
9798import Control.Monad.ST.Lazy
9899import Control.Monad.ST.Strict qualified as StrictST
@@ -104,6 +105,7 @@ import Control.Monad.Fail qualified as Fail
104105import Data.Bifoldable
105106import Data.Bifunctor (bimap )
106107import Data.Dynamic (Dynamic , toDyn )
108+ import Data.Hashable (Hashable (hash ))
107109import Data.List.Trace qualified as Trace
108110import Data.Map.Strict (Map )
109111import Data.Maybe (fromMaybe )
@@ -122,6 +124,7 @@ import GHC.Generics (Generic)
122124import Quiet (Quiet (.. ))
123125
124126import Control.Monad.IOSim.CommonTypes
127+ import Control.Monad.IOSim.CommonTypes qualified as Sim
125128import Control.Monad.IOSim.STM
126129import Control.Monad.IOSimPOR.Types
127130
@@ -193,6 +196,7 @@ data SimA s a where
193196 ExploreRaces :: SimA s b -> SimA s b
194197
195198 Fix :: (x -> IOSim s x ) -> (x -> SimA s r ) -> SimA s r
199+ NewUnique :: (Sim. Unique s -> SimA s r ) -> SimA s r
196200
197201
198202newtype STM s a = STM { unSTM :: forall r . (a -> StmA s r ) -> StmA s r }
@@ -626,6 +630,11 @@ instance MonadTraceMVar (IOSim s) where
626630instance MonadLabelledMVar (IOSim s ) where
627631 labelMVar = labelMVarDefault
628632
633+ instance MonadUnique (IOSim s ) where
634+ type Unique (IOSim s ) = Sim. Unique s
635+ newUnique = IOSim (oneShot NewUnique )
636+ hashUnique = hash
637+
629638data Async s a = Async ! IOSimThreadId (STM s (Either SomeException a ))
630639
631640instance Eq (Async s a ) where
@@ -1056,6 +1065,9 @@ data SimEventType
10561065 | EventThreadUnhandled SomeException
10571066 -- ^ thread terminated by an unhandled exception
10581067
1068+ | EventUniqueCreated Integer
1069+ -- ^ created the n-th 'Unique'
1070+
10591071 --
10601072 -- STM events
10611073 --
@@ -1163,6 +1175,7 @@ ppSimEventType = \case
11631175 EventThreadFinished -> " ThreadFinished"
11641176 EventThreadUnhandled a ->
11651177 " ThreadUnhandled " ++ show a
1178+ EventUniqueCreated n -> " UniqueCreated " ++ show n
11661179 EventTxCommitted written created mbEff ->
11671180 concat [ " TxCommitted " ,
11681181 ppList (ppLabelled show ) written, " " ,
0 commit comments