io-classes 1.5.0.0 → 1.6.0.0
raw patch · 31 files changed
+3160/−28 lines, 31 filesdep +QuickCheckdep +deepseqdep +io-classesdep ~basedep ~mtldep ~stmPVP ok
version bump matches the API change (PVP)
Dependencies added: QuickCheck, deepseq, io-classes, nothunks, tasty, tasty-quickcheck
Dependency ranges changed: base, mtl, stm
API changes (from Hackage documentation)
- Control.Concurrent.Class.MonadMVar: class (MonadMVar m, Monad (InspectMVarMonad m)) => MonadInspectMVar m where {
- Control.Concurrent.Class.MonadMVar: class Monad m => MonadMVar m where {
- Control.Concurrent.Class.MonadMVar: inspectMVar :: MonadInspectMVar m => proxy m -> MVar m a -> InspectMVarMonad m (Maybe a)
- Control.Concurrent.Class.MonadMVar: instance (Control.Monad.Class.MonadThrow.MonadMask m, Control.Concurrent.Class.MonadMVar.MonadMVar m) => Control.Concurrent.Class.MonadMVar.MonadMVar (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Concurrent.Class.MonadMVar: instance Control.Concurrent.Class.MonadMVar.MonadInspectMVar GHC.Types.IO
- Control.Concurrent.Class.MonadMVar: instance Control.Concurrent.Class.MonadMVar.MonadMVar GHC.Types.IO
- Control.Concurrent.Class.MonadMVar: isEmptyMVar :: MonadMVar m => MVar m a -> m Bool
- Control.Concurrent.Class.MonadMVar: modifyMVar :: (MonadMVar m, MonadMask m, MonadEvaluate m) => MVar m a -> (a -> m (a, b)) -> m b
- Control.Concurrent.Class.MonadMVar: modifyMVarMasked :: (MonadMVar m, MonadMask m, MonadEvaluate m) => MVar m a -> (a -> m (a, b)) -> m b
- Control.Concurrent.Class.MonadMVar: modifyMVarMasked_ :: (MonadMVar m, MonadMask m) => MVar m a -> (a -> m a) -> m ()
- Control.Concurrent.Class.MonadMVar: modifyMVar_ :: (MonadMVar m, MonadMask m) => MVar m a -> (a -> m a) -> m ()
- Control.Concurrent.Class.MonadMVar: newEmptyMVar :: MonadMVar m => m (MVar m a)
- Control.Concurrent.Class.MonadMVar: newMVar :: MonadMVar m => a -> m (MVar m a)
- Control.Concurrent.Class.MonadMVar: putMVar :: MonadMVar m => MVar m a -> a -> m ()
- Control.Concurrent.Class.MonadMVar: readMVar :: MonadMVar m => MVar m a -> m a
- Control.Concurrent.Class.MonadMVar: swapMVar :: (MonadMVar m, MonadMask m) => MVar m a -> a -> m a
- Control.Concurrent.Class.MonadMVar: takeMVar :: MonadMVar m => MVar m a -> m a
- Control.Concurrent.Class.MonadMVar: tryPutMVar :: MonadMVar m => MVar m a -> a -> m Bool
- Control.Concurrent.Class.MonadMVar: tryReadMVar :: MonadMVar m => MVar m a -> m (Maybe a)
- Control.Concurrent.Class.MonadMVar: tryTakeMVar :: MonadMVar m => MVar m a -> m (Maybe a)
- Control.Concurrent.Class.MonadMVar: type InspectMVarMonad m :: Type -> Type;
- Control.Concurrent.Class.MonadMVar: type MVar m :: Type -> Type;
- Control.Concurrent.Class.MonadMVar: withMVar :: (MonadMVar m, MonadMask m) => MVar m a -> (a -> m b) -> m b
- Control.Concurrent.Class.MonadMVar: withMVarMasked :: (MonadMVar m, MonadMask m) => MVar m a -> (a -> m b) -> m b
- Control.Concurrent.Class.MonadMVar: }
- Control.Concurrent.Class.MonadSTM.TArray: type TArray m :: Type -> Type -> Type
- Control.Concurrent.Class.MonadSTM.TBQueue: flushTBQueue :: MonadSTM m => TBQueue m a -> STM m [a]
- Control.Concurrent.Class.MonadSTM.TBQueue: isEmptyTBQueue :: MonadSTM m => TBQueue m a -> STM m Bool
- Control.Concurrent.Class.MonadSTM.TBQueue: isFullTBQueue :: MonadSTM m => TBQueue m a -> STM m Bool
- Control.Concurrent.Class.MonadSTM.TBQueue: labelTBQueue :: MonadLabelledSTM m => TBQueue m a -> String -> STM m ()
- Control.Concurrent.Class.MonadSTM.TBQueue: labelTBQueueIO :: MonadLabelledSTM m => TBQueue m a -> String -> m ()
- Control.Concurrent.Class.MonadSTM.TBQueue: lengthTBQueue :: MonadSTM m => TBQueue m a -> STM m Natural
- Control.Concurrent.Class.MonadSTM.TBQueue: newTBQueue :: MonadSTM m => Natural -> STM m (TBQueue m a)
- Control.Concurrent.Class.MonadSTM.TBQueue: newTBQueueIO :: MonadSTM m => Natural -> m (TBQueue m a)
- Control.Concurrent.Class.MonadSTM.TBQueue: peekTBQueue :: MonadSTM m => TBQueue m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TBQueue: readTBQueue :: MonadSTM m => TBQueue m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TBQueue: traceTBQueue :: MonadTraceSTM m => proxy m -> TBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
- Control.Concurrent.Class.MonadSTM.TBQueue: traceTBQueueIO :: MonadTraceSTM m => TBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
- Control.Concurrent.Class.MonadSTM.TBQueue: tryPeekTBQueue :: MonadSTM m => TBQueue m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TBQueue: tryReadTBQueue :: MonadSTM m => TBQueue m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TBQueue: type TBQueue m :: Type -> Type
- Control.Concurrent.Class.MonadSTM.TBQueue: unGetTBQueue :: MonadSTM m => TBQueue m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TBQueue: writeTBQueue :: MonadSTM m => TBQueue m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TChan: cloneTChan :: MonadSTM m => TChan m a -> STM m (TChan m a)
- Control.Concurrent.Class.MonadSTM.TChan: dupTChan :: MonadSTM m => TChan m a -> STM m (TChan m a)
- Control.Concurrent.Class.MonadSTM.TChan: isEmptyTChan :: MonadSTM m => TChan m a -> STM m Bool
- Control.Concurrent.Class.MonadSTM.TChan: newBroadcastTChan :: MonadSTM m => STM m (TChan m a)
- Control.Concurrent.Class.MonadSTM.TChan: newBroadcastTChanIO :: MonadSTM m => m (TChan m a)
- Control.Concurrent.Class.MonadSTM.TChan: newTChan :: MonadSTM m => STM m (TChan m a)
- Control.Concurrent.Class.MonadSTM.TChan: newTChanIO :: MonadSTM m => m (TChan m a)
- Control.Concurrent.Class.MonadSTM.TChan: peekTChan :: MonadSTM m => TChan m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TChan: readTChan :: MonadSTM m => TChan m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TChan: tryPeekTChan :: MonadSTM m => TChan m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TChan: tryReadTChan :: MonadSTM m => TChan m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TChan: type TChan m :: Type -> Type
- Control.Concurrent.Class.MonadSTM.TChan: unGetTChan :: MonadSTM m => TChan m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TChan: writeTChan :: MonadSTM m => TChan m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TMVar: isEmptyTMVar :: MonadSTM m => TMVar m a -> STM m Bool
- Control.Concurrent.Class.MonadSTM.TMVar: labelTMVar :: MonadLabelledSTM m => TMVar m a -> String -> STM m ()
- Control.Concurrent.Class.MonadSTM.TMVar: labelTMVarIO :: MonadLabelledSTM m => TMVar m a -> String -> m ()
- Control.Concurrent.Class.MonadSTM.TMVar: newEmptyTMVar :: MonadSTM m => STM m (TMVar m a)
- Control.Concurrent.Class.MonadSTM.TMVar: newEmptyTMVarIO :: MonadSTM m => m (TMVar m a)
- Control.Concurrent.Class.MonadSTM.TMVar: newTMVar :: MonadSTM m => a -> STM m (TMVar m a)
- Control.Concurrent.Class.MonadSTM.TMVar: newTMVarIO :: MonadSTM m => a -> m (TMVar m a)
- Control.Concurrent.Class.MonadSTM.TMVar: putTMVar :: MonadSTM m => TMVar m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TMVar: readTMVar :: MonadSTM m => TMVar m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TMVar: swapTMVar :: MonadSTM m => TMVar m a -> a -> STM m a
- Control.Concurrent.Class.MonadSTM.TMVar: takeTMVar :: MonadSTM m => TMVar m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TMVar: traceTMVar :: MonadTraceSTM m => proxy m -> TMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> STM m ()
- Control.Concurrent.Class.MonadSTM.TMVar: traceTMVarIO :: MonadTraceSTM m => TMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> m ()
- Control.Concurrent.Class.MonadSTM.TMVar: tryPutTMVar :: MonadSTM m => TMVar m a -> a -> STM m Bool
- Control.Concurrent.Class.MonadSTM.TMVar: tryReadTMVar :: MonadSTM m => TMVar m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TMVar: tryTakeTMVar :: MonadSTM m => TMVar m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TMVar: type TMVar m :: Type -> Type
- Control.Concurrent.Class.MonadSTM.TMVar: writeTMVar :: MonadSTM m => TMVar m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TQueue: flushTQueue :: MonadSTM m => TQueue m a -> STM m [a]
- Control.Concurrent.Class.MonadSTM.TQueue: isEmptyTQueue :: MonadSTM m => TQueue m a -> STM m Bool
- Control.Concurrent.Class.MonadSTM.TQueue: labelTQueue :: MonadLabelledSTM m => TQueue m a -> String -> STM m ()
- Control.Concurrent.Class.MonadSTM.TQueue: labelTQueueIO :: MonadLabelledSTM m => TQueue m a -> String -> m ()
- Control.Concurrent.Class.MonadSTM.TQueue: newTQueue :: MonadSTM m => STM m (TQueue m a)
- Control.Concurrent.Class.MonadSTM.TQueue: newTQueueIO :: MonadSTM m => m (TQueue m a)
- Control.Concurrent.Class.MonadSTM.TQueue: peekTQueue :: MonadSTM m => TQueue m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TQueue: readTQueue :: MonadSTM m => TQueue m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TQueue: traceTQueue :: MonadTraceSTM m => proxy m -> TQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
- Control.Concurrent.Class.MonadSTM.TQueue: traceTQueueIO :: MonadTraceSTM m => TQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
- Control.Concurrent.Class.MonadSTM.TQueue: tryPeekTQueue :: MonadSTM m => TQueue m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TQueue: tryReadTQueue :: MonadSTM m => TQueue m a -> STM m (Maybe a)
- Control.Concurrent.Class.MonadSTM.TQueue: type TQueue m :: Type -> Type
- Control.Concurrent.Class.MonadSTM.TQueue: unGetTQueue :: MonadSTM m => TQueue m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TQueue: writeTQueue :: MonadSTM m => TQueue m a -> a -> STM m ()
- Control.Concurrent.Class.MonadSTM.TSem: labelTSem :: MonadLabelledSTM m => TSem m -> String -> STM m ()
- Control.Concurrent.Class.MonadSTM.TSem: labelTSemIO :: MonadLabelledSTM m => TSem m -> String -> m ()
- Control.Concurrent.Class.MonadSTM.TSem: newTSem :: MonadSTM m => Integer -> STM m (TSem m)
- Control.Concurrent.Class.MonadSTM.TSem: signalTSem :: MonadSTM m => TSem m -> STM m ()
- Control.Concurrent.Class.MonadSTM.TSem: signalTSemN :: MonadSTM m => Natural -> TSem m -> STM m ()
- Control.Concurrent.Class.MonadSTM.TSem: traceTSem :: MonadTraceSTM m => proxy m -> TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> STM m ()
- Control.Concurrent.Class.MonadSTM.TSem: traceTSemIO :: MonadTraceSTM m => TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> m ()
- Control.Concurrent.Class.MonadSTM.TSem: type TSem m :: Type
- Control.Concurrent.Class.MonadSTM.TSem: waitTSem :: MonadSTM m => TSem m -> STM m ()
- Control.Concurrent.Class.MonadSTM.TVar: check :: MonadSTM m => Bool -> STM m ()
- Control.Concurrent.Class.MonadSTM.TVar: labelTVar :: MonadLabelledSTM m => TVar m a -> String -> STM m ()
- Control.Concurrent.Class.MonadSTM.TVar: labelTVarIO :: MonadLabelledSTM m => TVar m a -> String -> m ()
- Control.Concurrent.Class.MonadSTM.TVar: modifyTVar :: MonadSTM m => TVar m a -> (a -> a) -> STM m ()
- Control.Concurrent.Class.MonadSTM.TVar: modifyTVar' :: MonadSTM m => TVar m a -> (a -> a) -> STM m ()
- Control.Concurrent.Class.MonadSTM.TVar: newTVar :: MonadSTM m => a -> STM m (TVar m a)
- Control.Concurrent.Class.MonadSTM.TVar: newTVarIO :: MonadSTM m => a -> m (TVar m a)
- Control.Concurrent.Class.MonadSTM.TVar: readTVar :: MonadSTM m => TVar m a -> STM m a
- Control.Concurrent.Class.MonadSTM.TVar: readTVarIO :: MonadSTM m => TVar m a -> m a
- Control.Concurrent.Class.MonadSTM.TVar: stateTVar :: MonadSTM m => TVar m s -> (s -> (a, s)) -> STM m a
- Control.Concurrent.Class.MonadSTM.TVar: swapTVar :: MonadSTM m => TVar m a -> a -> STM m a
- Control.Concurrent.Class.MonadSTM.TVar: traceTVar :: MonadTraceSTM m => proxy m -> TVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> STM m ()
- Control.Concurrent.Class.MonadSTM.TVar: traceTVarIO :: MonadTraceSTM m => TVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> m ()
- Control.Concurrent.Class.MonadSTM.TVar: type TVar m :: Type -> Type
- Control.Concurrent.Class.MonadSTM.TVar: writeTVar :: MonadSTM m => TVar m a -> a -> STM m ()
- Control.Monad.Class.MonadAsync: --
- Control.Monad.Class.MonadAsync: -- See <a>Async</a>.
- Control.Monad.Class.MonadAsync: -- | An asynchronous action
- Control.Monad.Class.MonadAsync: AsyncCancelled :: AsyncCancelled
- Control.Monad.Class.MonadAsync: Concurrently :: m a -> Concurrently m a
- Control.Monad.Class.MonadAsync: ExceptionInLinkedThread :: String -> SomeException -> ExceptionInLinkedThread
- Control.Monad.Class.MonadAsync: [runConcurrently] :: Concurrently m a -> m a
- Control.Monad.Class.MonadAsync: async :: MonadAsync m => m a -> m (Async m a)
- Control.Monad.Class.MonadAsync: asyncBound :: MonadAsync m => m a -> m (Async m a)
- Control.Monad.Class.MonadAsync: asyncOn :: MonadAsync m => Int -> m a -> m (Async m a)
- Control.Monad.Class.MonadAsync: asyncOnWithUnmask :: MonadAsync m => Int -> ((forall b. m b -> m b) -> m a) -> m (Async m a)
- Control.Monad.Class.MonadAsync: asyncThreadId :: MonadAsync m => Async m a -> ThreadId m
- Control.Monad.Class.MonadAsync: asyncWithUnmask :: MonadAsync m => ((forall b. m b -> m b) -> m a) -> m (Async m a)
- Control.Monad.Class.MonadAsync: cancel :: MonadAsync m => Async m a -> m ()
- Control.Monad.Class.MonadAsync: cancelWith :: (MonadAsync m, Exception e) => Async m a -> e -> m ()
- Control.Monad.Class.MonadAsync: class (MonadSTM m, MonadThread m) => MonadAsync m where {
- Control.Monad.Class.MonadAsync: compareAsyncs :: (MonadAsync m, Ord (ThreadId m)) => Async m a -> Async m b -> Ordering
- Control.Monad.Class.MonadAsync: concurrently :: MonadAsync m => m a -> m b -> m (a, b)
- Control.Monad.Class.MonadAsync: concurrently_ :: MonadAsync m => m a -> m b -> m ()
- Control.Monad.Class.MonadAsync: data () => AsyncCancelled
- Control.Monad.Class.MonadAsync: data ExceptionInLinkedThread
- Control.Monad.Class.MonadAsync: forConcurrently :: (Traversable t, MonadAsync m) => t a -> (a -> m b) -> m (t b)
- Control.Monad.Class.MonadAsync: forConcurrently_ :: (Foldable f, MonadAsync m) => f a -> (a -> m b) -> m ()
- Control.Monad.Class.MonadAsync: instance (Control.Monad.Class.MonadAsync.MonadAsync m, Control.Monad.Class.MonadThrow.MonadCatch (Control.Monad.Class.MonadSTM.Internal.STM m), Control.Monad.Class.MonadFork.MonadFork m, Control.Monad.Class.MonadThrow.MonadMask m) => Control.Monad.Class.MonadAsync.MonadAsync (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadAsync: instance (Control.Monad.Class.MonadAsync.MonadAsync m, Control.Monad.Class.MonadTimer.MonadTimer m) => GHC.Base.Alternative (Control.Monad.Class.MonadAsync.Concurrently m)
- Control.Monad.Class.MonadAsync: instance (GHC.Base.Monoid a, Control.Monad.Class.MonadAsync.MonadAsync m) => GHC.Base.Monoid (Control.Monad.Class.MonadAsync.Concurrently m a)
- Control.Monad.Class.MonadAsync: instance (GHC.Base.Semigroup a, Control.Monad.Class.MonadAsync.MonadAsync m) => GHC.Base.Semigroup (Control.Monad.Class.MonadAsync.Concurrently m a)
- Control.Monad.Class.MonadAsync: instance Control.Monad.Class.MonadAsync.MonadAsync GHC.Types.IO
- Control.Monad.Class.MonadAsync: instance Control.Monad.Class.MonadAsync.MonadAsync m => GHC.Base.Applicative (Control.Monad.Class.MonadAsync.Concurrently m)
- Control.Monad.Class.MonadAsync: instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.Class.MonadAsync.Concurrently m)
- Control.Monad.Class.MonadAsync: instance GHC.Exception.Type.Exception Control.Monad.Class.MonadAsync.ExceptionInLinkedThread
- Control.Monad.Class.MonadAsync: instance GHC.Show.Show Control.Monad.Class.MonadAsync.ExceptionInLinkedThread
- Control.Monad.Class.MonadAsync: link :: (MonadAsync m, MonadFork m, MonadMask m) => Async m a -> m ()
- Control.Monad.Class.MonadAsync: link2 :: (MonadAsync m, MonadFork m, MonadMask m) => Async m a -> Async m b -> m ()
- Control.Monad.Class.MonadAsync: link2Only :: (MonadAsync m, MonadFork m, MonadMask m) => (SomeException -> Bool) -> Async m a -> Async m b -> m ()
- Control.Monad.Class.MonadAsync: linkOnly :: forall m a. (MonadAsync m, MonadFork m, MonadMask m) => (SomeException -> Bool) -> Async m a -> m ()
- Control.Monad.Class.MonadAsync: mapConcurrently :: (Traversable t, MonadAsync m) => (a -> m b) -> t a -> m (t b)
- Control.Monad.Class.MonadAsync: mapConcurrently_ :: (Foldable f, MonadAsync m) => (a -> m b) -> f a -> m ()
- Control.Monad.Class.MonadAsync: newtype Concurrently m a
- Control.Monad.Class.MonadAsync: poll :: MonadAsync m => Async m a -> m (Maybe (Either SomeException a))
- Control.Monad.Class.MonadAsync: pollSTM :: MonadAsync m => Async m a -> STM m (Maybe (Either SomeException a))
- Control.Monad.Class.MonadAsync: race :: MonadAsync m => m a -> m b -> m (Either a b)
- Control.Monad.Class.MonadAsync: race_ :: MonadAsync m => m a -> m b -> m ()
- Control.Monad.Class.MonadAsync: replicateConcurrently :: MonadAsync m => Int -> m a -> m [a]
- Control.Monad.Class.MonadAsync: replicateConcurrently_ :: MonadAsync m => Int -> m a -> m ()
- Control.Monad.Class.MonadAsync: type Async m = (async :: Type -> Type) | async -> m;
- Control.Monad.Class.MonadAsync: uninterruptibleCancel :: (MonadAsync m, MonadMask m) => Async m a -> m ()
- Control.Monad.Class.MonadAsync: wait :: MonadAsync m => Async m a -> m a
- Control.Monad.Class.MonadAsync: waitAny :: MonadAsync m => [Async m a] -> m (Async m a, a)
- Control.Monad.Class.MonadAsync: waitAnyCancel :: (MonadAsync m, MonadThrow m) => [Async m a] -> m (Async m a, a)
- Control.Monad.Class.MonadAsync: waitAnyCatch :: MonadAsync m => [Async m a] -> m (Async m a, Either SomeException a)
- Control.Monad.Class.MonadAsync: waitAnyCatchCancel :: (MonadAsync m, MonadThrow m) => [Async m a] -> m (Async m a, Either SomeException a)
- Control.Monad.Class.MonadAsync: waitAnyCatchSTM :: MonadAsync m => [Async m a] -> STM m (Async m a, Either SomeException a)
- Control.Monad.Class.MonadAsync: waitAnySTM :: (MonadAsync m, MonadThrow (STM m)) => [Async m a] -> STM m (Async m a, a)
- Control.Monad.Class.MonadAsync: waitBoth :: MonadAsync m => Async m a -> Async m b -> m (a, b)
- Control.Monad.Class.MonadAsync: waitBothSTM :: (MonadAsync m, MonadThrow (STM m)) => Async m a -> Async m b -> STM m (a, b)
- Control.Monad.Class.MonadAsync: waitCatch :: MonadAsync m => Async m a -> m (Either SomeException a)
- Control.Monad.Class.MonadAsync: waitCatchSTM :: MonadAsync m => Async m a -> STM m (Either SomeException a)
- Control.Monad.Class.MonadAsync: waitEither :: MonadAsync m => Async m a -> Async m b -> m (Either a b)
- Control.Monad.Class.MonadAsync: waitEitherCancel :: (MonadAsync m, MonadThrow m) => Async m a -> Async m b -> m (Either a b)
- Control.Monad.Class.MonadAsync: waitEitherCatch :: MonadAsync m => Async m a -> Async m b -> m (Either (Either SomeException a) (Either SomeException b))
- Control.Monad.Class.MonadAsync: waitEitherCatchCancel :: (MonadAsync m, MonadThrow m) => Async m a -> Async m b -> m (Either (Either SomeException a) (Either SomeException b))
- Control.Monad.Class.MonadAsync: waitEitherCatchSTM :: MonadAsync m => Async m a -> Async m b -> STM m (Either (Either SomeException a) (Either SomeException b))
- Control.Monad.Class.MonadAsync: waitEitherSTM :: (MonadAsync m, MonadThrow (STM m)) => Async m a -> Async m b -> STM m (Either a b)
- Control.Monad.Class.MonadAsync: waitEitherSTM_ :: (MonadAsync m, MonadThrow (STM m)) => Async m a -> Async m b -> STM m ()
- Control.Monad.Class.MonadAsync: waitEither_ :: MonadAsync m => Async m a -> Async m b -> m ()
- Control.Monad.Class.MonadAsync: waitSTM :: (MonadAsync m, MonadThrow (STM m)) => Async m a -> STM m a
- Control.Monad.Class.MonadAsync: withAsync :: (MonadAsync m, MonadMask m) => m a -> (Async m a -> m b) -> m b
- Control.Monad.Class.MonadAsync: withAsyncBound :: (MonadAsync m, MonadMask m) => m a -> (Async m a -> m b) -> m b
- Control.Monad.Class.MonadAsync: withAsyncOn :: (MonadAsync m, MonadMask m) => Int -> m a -> (Async m a -> m b) -> m b
- Control.Monad.Class.MonadAsync: withAsyncOnWithUnmask :: (MonadAsync m, MonadMask m) => Int -> ((forall c. m c -> m c) -> m a) -> (Async m a -> m b) -> m b
- Control.Monad.Class.MonadAsync: withAsyncWithUnmask :: (MonadAsync m, MonadMask m) => ((forall c. m c -> m c) -> m a) -> (Async m a -> m b) -> m b
- Control.Monad.Class.MonadAsync: }
- Control.Monad.Class.MonadEventlog: class Monad m => MonadEventlog m
- Control.Monad.Class.MonadEventlog: instance Control.Monad.Class.MonadEventlog.MonadEventlog GHC.Types.IO
- Control.Monad.Class.MonadEventlog: instance Control.Monad.Class.MonadEventlog.MonadEventlog m => Control.Monad.Class.MonadEventlog.MonadEventlog (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadEventlog: traceEventIO :: MonadEventlog m => String -> m ()
- Control.Monad.Class.MonadEventlog: traceMarkerIO :: MonadEventlog m => String -> m ()
- Control.Monad.Class.MonadFork: class MonadThread m => MonadFork m
- Control.Monad.Class.MonadFork: class (Monad m, Eq (ThreadId m), Ord (ThreadId m), Show (ThreadId m)) => MonadThread m where {
- Control.Monad.Class.MonadFork: forkFinally :: MonadFork m => m a -> (Either SomeException a -> m ()) -> m (ThreadId m)
- Control.Monad.Class.MonadFork: forkIO :: MonadFork m => m () -> m (ThreadId m)
- Control.Monad.Class.MonadFork: forkIOWithUnmask :: MonadFork m => ((forall a. m a -> m a) -> m ()) -> m (ThreadId m)
- Control.Monad.Class.MonadFork: forkOn :: MonadFork m => Int -> m () -> m (ThreadId m)
- Control.Monad.Class.MonadFork: instance Control.Monad.Class.MonadFork.MonadFork GHC.Types.IO
- Control.Monad.Class.MonadFork: instance Control.Monad.Class.MonadFork.MonadFork m => Control.Monad.Class.MonadFork.MonadFork (Control.Monad.Trans.Reader.ReaderT e m)
- Control.Monad.Class.MonadFork: instance Control.Monad.Class.MonadFork.MonadThread GHC.Types.IO
- Control.Monad.Class.MonadFork: instance Control.Monad.Class.MonadFork.MonadThread m => Control.Monad.Class.MonadFork.MonadThread (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadFork: killThread :: MonadFork m => ThreadId m -> m ()
- Control.Monad.Class.MonadFork: labelThisThread :: MonadThread m => String -> m ()
- Control.Monad.Class.MonadFork: labelThread :: MonadThread m => ThreadId m -> String -> m ()
- Control.Monad.Class.MonadFork: myThreadId :: MonadThread m => m (ThreadId m)
- Control.Monad.Class.MonadFork: throwTo :: (MonadFork m, Exception e) => ThreadId m -> e -> m ()
- Control.Monad.Class.MonadFork: type ThreadId m :: Type;
- Control.Monad.Class.MonadFork: yield :: MonadFork m => m ()
- Control.Monad.Class.MonadFork: }
- Control.Monad.Class.MonadST: class PrimMonad m => MonadST m
- Control.Monad.Class.MonadST: instance (Control.Monad.Class.MonadST.MonadST m, Control.Monad.Primitive.PrimMonad m) => Control.Monad.Class.MonadST.MonadST (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadST: instance Control.Monad.Class.MonadST.MonadST (GHC.ST.ST s)
- Control.Monad.Class.MonadST: instance Control.Monad.Class.MonadST.MonadST GHC.Types.IO
- Control.Monad.Class.MonadST: stToIO :: MonadST m => ST (PrimState m) a -> m a
- Control.Monad.Class.MonadST: withLiftST :: MonadST m => (forall s. (forall a. ST s a -> m a) -> b) -> b
- Control.Monad.Class.MonadSTM: -- | The STM monad.
- Control.Monad.Class.MonadSTM: [TraceValue] :: forall tr. Typeable tr => Maybe tr -> Maybe String -> TraceValue
- Control.Monad.Class.MonadSTM: atomically :: (MonadSTM m, HasCallStack) => STM m a -> m a
- Control.Monad.Class.MonadSTM: check :: MonadSTM m => Bool -> STM m ()
- Control.Monad.Class.MonadSTM: class (MonadSTM m, Monad (InspectMonad m)) => MonadInspectSTM m where {
- Control.Monad.Class.MonadSTM: class MonadSTM m => MonadLabelledSTM m
- Control.Monad.Class.MonadSTM: class (Monad m, Monad (STM m)) => MonadSTM m where {
- Control.Monad.Class.MonadSTM: class MonadInspectSTM m => MonadTraceSTM m
- Control.Monad.Class.MonadSTM: data TraceValue
- Control.Monad.Class.MonadSTM: inspectTMVar :: MonadInspectSTM m => proxy m -> TMVar m a -> InspectMonad m (Maybe a)
- Control.Monad.Class.MonadSTM: inspectTVar :: MonadInspectSTM m => proxy m -> TVar m a -> InspectMonad m a
- Control.Monad.Class.MonadSTM: orElse :: MonadSTM m => STM m a -> STM m a -> STM m a
- Control.Monad.Class.MonadSTM: pattern DontTrace :: TraceValue
- Control.Monad.Class.MonadSTM: pattern TraceString :: String -> TraceValue
- Control.Monad.Class.MonadSTM: pattern TraceDynamic :: () => forall tr. Typeable tr => tr -> TraceValue
- Control.Monad.Class.MonadSTM: retry :: MonadSTM m => STM m a
- Control.Monad.Class.MonadSTM: throwSTM :: (MonadSTM m, MonadThrow (STM m), Exception e) => e -> STM m a
- Control.Monad.Class.MonadSTM: traceTBQueue :: MonadTraceSTM m => proxy m -> TBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM: traceTBQueueIO :: MonadTraceSTM m => TBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM: traceTMVar :: (MonadTraceSTM m, TMVar m a ~ TMVarDefault m a) => proxy m -> TMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM: traceTMVarIO :: MonadTraceSTM m => TMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM: traceTQueue :: MonadTraceSTM m => proxy m -> TQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM: traceTQueueIO :: MonadTraceSTM m => TQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM: traceTSem :: (MonadTraceSTM m, TSem m ~ TSemDefault m) => proxy m -> TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM: traceTSemIO :: MonadTraceSTM m => TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM: traceTVar :: MonadTraceSTM m => proxy m -> TVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM: traceTVarIO :: MonadTraceSTM m => TVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM: type InspectMonad m :: Type -> Type;
- Control.Monad.Class.MonadSTM: type STM m = (stm :: Type -> Type) | stm -> m;
- Control.Monad.Class.MonadSTM: }
- Control.Monad.Class.MonadSTM.Internal: --
- Control.Monad.Class.MonadSTM.Internal: -- See <a>TVar</a>.
- Control.Monad.Class.MonadSTM.Internal: -- | A type of a <a>TVar</a>.
- Control.Monad.Class.MonadSTM.Internal: TArray :: Array i (TVar m e) -> TArrayDefault m i e
- Control.Monad.Class.MonadSTM.Internal: TBQueue :: !TVar m Natural -> !TVar m [a] -> !TVar m Natural -> !TVar m [a] -> !Natural -> TBQueueDefault m a
- Control.Monad.Class.MonadSTM.Internal: TChan :: TVar m (TVarList m a) -> TVar m (TVarList m a) -> TChanDefault m a
- Control.Monad.Class.MonadSTM.Internal: TMVar :: TVar m (Maybe a) -> TMVarDefault m a
- Control.Monad.Class.MonadSTM.Internal: TQueue :: !TVar m [a] -> !TVar m [a] -> TQueueDefault m a
- Control.Monad.Class.MonadSTM.Internal: TSem :: TVar m Integer -> TSemDefault m
- Control.Monad.Class.MonadSTM.Internal: [TraceValue] :: forall tr. Typeable tr => Maybe tr -> Maybe String -> TraceValue
- Control.Monad.Class.MonadSTM.Internal: atomically :: (MonadSTM m, HasCallStack) => STM m a -> m a
- Control.Monad.Class.MonadSTM.Internal: catchSTM :: (MonadSTM m, MonadCatch (STM m), Exception e) => STM m a -> (e -> STM m a) -> STM m a
- Control.Monad.Class.MonadSTM.Internal: check :: MonadSTM m => Bool -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: class (MonadSTM m, Monad (InspectMonad m)) => MonadInspectSTM m where {
- Control.Monad.Class.MonadSTM.Internal: class MonadSTM m => MonadLabelledSTM m
- Control.Monad.Class.MonadSTM.Internal: class (Monad m, Monad (STM m)) => MonadSTM m where {
- Control.Monad.Class.MonadSTM.Internal: class MonadInspectSTM m => MonadTraceSTM m
- Control.Monad.Class.MonadSTM.Internal: cloneTChan :: MonadSTM m => TChan m a -> STM m (TChan m a)
- Control.Monad.Class.MonadSTM.Internal: cloneTChanDefault :: MonadSTM m => TChanDefault m a -> STM m (TChanDefault m a)
- Control.Monad.Class.MonadSTM.Internal: data TArrayDefault m i e
- Control.Monad.Class.MonadSTM.Internal: data TBQueueDefault m a
- Control.Monad.Class.MonadSTM.Internal: data TChanDefault m a
- Control.Monad.Class.MonadSTM.Internal: data TQueueDefault m a
- Control.Monad.Class.MonadSTM.Internal: data TraceValue
- Control.Monad.Class.MonadSTM.Internal: dupTChan :: MonadSTM m => TChan m a -> STM m (TChan m a)
- Control.Monad.Class.MonadSTM.Internal: dupTChanDefault :: MonadSTM m => TChanDefault m a -> STM m (TChanDefault m a)
- Control.Monad.Class.MonadSTM.Internal: flushTBQueue :: MonadSTM m => TBQueue m a -> STM m [a]
- Control.Monad.Class.MonadSTM.Internal: flushTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m [a]
- Control.Monad.Class.MonadSTM.Internal: flushTQueue :: MonadSTM m => TQueue m a -> STM m [a]
- Control.Monad.Class.MonadSTM.Internal: flushTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m [a]
- Control.Monad.Class.MonadSTM.Internal: inspectTMVar :: MonadInspectSTM m => proxy m -> TMVar m a -> InspectMonad m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: inspectTVar :: MonadInspectSTM m => proxy m -> TVar m a -> InspectMonad m a
- Control.Monad.Class.MonadSTM.Internal: instance (GHC.Base.Monad stm, Control.Monad.Class.MonadSTM.Internal.MonadSTM m, stm GHC.Types.~ Control.Monad.Class.MonadSTM.Internal.STM m) => Data.Array.Base.MArray (Control.Monad.Class.MonadSTM.Internal.TArrayDefault m) e stm
- Control.Monad.Class.MonadSTM.Internal: instance (GHC.Classes.Eq (Control.Monad.Class.MonadSTM.Internal.TVar m e), GHC.Ix.Ix i) => GHC.Classes.Eq (Control.Monad.Class.MonadSTM.Internal.TArrayDefault m i e)
- Control.Monad.Class.MonadSTM.Internal: instance Control.Monad.Class.MonadSTM.Internal.MonadInspectSTM GHC.Types.IO
- Control.Monad.Class.MonadSTM.Internal: instance Control.Monad.Class.MonadSTM.Internal.MonadLabelledSTM GHC.Types.IO
- Control.Monad.Class.MonadSTM.Internal: instance Control.Monad.Class.MonadSTM.Internal.MonadSTM GHC.Types.IO
- Control.Monad.Class.MonadSTM.Internal: instance Control.Monad.Class.MonadSTM.Internal.MonadSTM m => Control.Monad.Class.MonadSTM.Internal.MonadSTM (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadSTM.Internal: instance Control.Monad.Class.MonadSTM.Internal.MonadTraceSTM GHC.Types.IO
- Control.Monad.Class.MonadSTM.Internal: instance GHC.Exception.Type.Exception Control.Monad.Class.MonadSTM.Internal.BlockedIndefinitely
- Control.Monad.Class.MonadSTM.Internal: instance GHC.Show.Show Control.Monad.Class.MonadSTM.Internal.BlockedIndefinitely
- Control.Monad.Class.MonadSTM.Internal: isEmptyTBQueue :: MonadSTM m => TBQueue m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isEmptyTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isEmptyTChan :: MonadSTM m => TChan m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isEmptyTChanDefault :: MonadSTM m => TChanDefault m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isEmptyTMVar :: MonadSTM m => TMVar m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isEmptyTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isEmptyTQueue :: MonadSTM m => TQueue m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isEmptyTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isFullTBQueue :: MonadSTM m => TBQueue m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: isFullTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: labelTArray :: (MonadLabelledSTM m, TArray m ~ TArrayDefault m, Ix i, Show i) => TArray m i e -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTArrayIO :: (MonadLabelledSTM m, Ix i, Show i) => TArray m i e -> String -> m ()
- Control.Monad.Class.MonadSTM.Internal: labelTBQueue :: (MonadLabelledSTM m, TBQueue m ~ TBQueueDefault m) => TBQueue m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTBQueueDefault :: MonadLabelledSTM m => TBQueueDefault m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTBQueueIO :: MonadLabelledSTM m => TBQueue m a -> String -> m ()
- Control.Monad.Class.MonadSTM.Internal: labelTChan :: (MonadLabelledSTM m, TChan m ~ TChanDefault m) => TChan m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTChanDefault :: MonadLabelledSTM m => TChanDefault m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTChanIO :: MonadLabelledSTM m => TChan m a -> String -> m ()
- Control.Monad.Class.MonadSTM.Internal: labelTMVar :: (MonadLabelledSTM m, TMVar m ~ TMVarDefault m) => TMVar m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTMVarDefault :: MonadLabelledSTM m => TMVarDefault m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTMVarIO :: MonadLabelledSTM m => TMVar m a -> String -> m ()
- Control.Monad.Class.MonadSTM.Internal: labelTQueue :: (MonadLabelledSTM m, TQueue m ~ TQueueDefault m) => TQueue m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTQueueDefault :: MonadLabelledSTM m => TQueueDefault m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTQueueIO :: MonadLabelledSTM m => TQueue m a -> String -> m ()
- Control.Monad.Class.MonadSTM.Internal: labelTSem :: (MonadLabelledSTM m, TSem m ~ TSemDefault m) => TSem m -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTSemDefault :: MonadLabelledSTM m => TSemDefault m -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTSemIO :: MonadLabelledSTM m => TSem m -> String -> m ()
- Control.Monad.Class.MonadSTM.Internal: labelTVar :: MonadLabelledSTM m => TVar m a -> String -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: labelTVarIO :: MonadLabelledSTM m => TVar m a -> String -> m ()
- Control.Monad.Class.MonadSTM.Internal: lengthTBQueue :: MonadSTM m => TBQueue m a -> STM m Natural
- Control.Monad.Class.MonadSTM.Internal: lengthTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Natural
- Control.Monad.Class.MonadSTM.Internal: modifyTVar :: MonadSTM m => TVar m a -> (a -> a) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: modifyTVar' :: MonadSTM m => TVar m a -> (a -> a) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: newBroadcastTChan :: MonadSTM m => STM m (TChan m a)
- Control.Monad.Class.MonadSTM.Internal: newBroadcastTChanDefault :: MonadSTM m => STM m (TChanDefault m a)
- Control.Monad.Class.MonadSTM.Internal: newBroadcastTChanIO :: MonadSTM m => m (TChan m a)
- Control.Monad.Class.MonadSTM.Internal: newEmptyTMVar :: MonadSTM m => STM m (TMVar m a)
- Control.Monad.Class.MonadSTM.Internal: newEmptyTMVarDefault :: MonadSTM m => STM m (TMVarDefault m a)
- Control.Monad.Class.MonadSTM.Internal: newEmptyTMVarIO :: MonadSTM m => m (TMVar m a)
- Control.Monad.Class.MonadSTM.Internal: newTBQueue :: MonadSTM m => Natural -> STM m (TBQueue m a)
- Control.Monad.Class.MonadSTM.Internal: newTBQueueDefault :: MonadSTM m => Natural -> STM m (TBQueueDefault m a)
- Control.Monad.Class.MonadSTM.Internal: newTBQueueIO :: MonadSTM m => Natural -> m (TBQueue m a)
- Control.Monad.Class.MonadSTM.Internal: newTChan :: MonadSTM m => STM m (TChan m a)
- Control.Monad.Class.MonadSTM.Internal: newTChanDefault :: MonadSTM m => STM m (TChanDefault m a)
- Control.Monad.Class.MonadSTM.Internal: newTChanIO :: MonadSTM m => m (TChan m a)
- Control.Monad.Class.MonadSTM.Internal: newTMVar :: MonadSTM m => a -> STM m (TMVar m a)
- Control.Monad.Class.MonadSTM.Internal: newTMVarDefault :: MonadSTM m => a -> STM m (TMVarDefault m a)
- Control.Monad.Class.MonadSTM.Internal: newTMVarIO :: MonadSTM m => a -> m (TMVar m a)
- Control.Monad.Class.MonadSTM.Internal: newTQueue :: MonadSTM m => STM m (TQueue m a)
- Control.Monad.Class.MonadSTM.Internal: newTQueueDefault :: MonadSTM m => STM m (TQueueDefault m a)
- Control.Monad.Class.MonadSTM.Internal: newTQueueIO :: MonadSTM m => m (TQueue m a)
- Control.Monad.Class.MonadSTM.Internal: newTSem :: MonadSTM m => Integer -> STM m (TSem m)
- Control.Monad.Class.MonadSTM.Internal: newTSemDefault :: MonadSTM m => Integer -> STM m (TSemDefault m)
- Control.Monad.Class.MonadSTM.Internal: newTVar :: MonadSTM m => a -> STM m (TVar m a)
- Control.Monad.Class.MonadSTM.Internal: newTVarIO :: MonadSTM m => a -> m (TVar m a)
- Control.Monad.Class.MonadSTM.Internal: newtype TMVarDefault m a
- Control.Monad.Class.MonadSTM.Internal: newtype TSemDefault m
- Control.Monad.Class.MonadSTM.Internal: orElse :: MonadSTM m => STM m a -> STM m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: pattern DontTrace :: TraceValue
- Control.Monad.Class.MonadSTM.Internal: pattern TraceString :: String -> TraceValue
- Control.Monad.Class.MonadSTM.Internal: pattern TraceDynamic :: () => forall tr. Typeable tr => tr -> TraceValue
- Control.Monad.Class.MonadSTM.Internal: peekTBQueue :: MonadSTM m => TBQueue m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: peekTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: peekTChan :: MonadSTM m => TChan m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: peekTChanDefault :: MonadSTM m => TChanDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: peekTQueue :: MonadSTM m => TQueue m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: peekTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: putTMVar :: MonadSTM m => TMVar m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: putTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: readTBQueue :: MonadSTM m => TBQueue m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTChan :: MonadSTM m => TChan m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTChanDefault :: MonadSTM m => TChanDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTMVar :: MonadSTM m => TMVar m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTQueue :: MonadSTM m => TQueue m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTVar :: MonadSTM m => TVar m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: readTVarIO :: MonadSTM m => TVar m a -> m a
- Control.Monad.Class.MonadSTM.Internal: retry :: MonadSTM m => STM m a
- Control.Monad.Class.MonadSTM.Internal: signalTSem :: MonadSTM m => TSem m -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: signalTSemDefault :: MonadSTM m => TSemDefault m -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: signalTSemN :: MonadSTM m => Natural -> TSem m -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: signalTSemNDefault :: MonadSTM m => Natural -> TSemDefault m -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: stateTVar :: MonadSTM m => TVar m s -> (s -> (a, s)) -> STM m a
- Control.Monad.Class.MonadSTM.Internal: swapTMVar :: MonadSTM m => TMVar m a -> a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: swapTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: swapTVar :: MonadSTM m => TVar m a -> a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: takeTMVar :: MonadSTM m => TMVar m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: takeTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m a
- Control.Monad.Class.MonadSTM.Internal: throwSTM :: (MonadSTM m, MonadThrow (STM m), Exception e) => e -> STM m a
- Control.Monad.Class.MonadSTM.Internal: traceTBQueue :: MonadTraceSTM m => proxy m -> TBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: traceTBQueueIO :: MonadTraceSTM m => TBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM.Internal: traceTMVar :: (MonadTraceSTM m, TMVar m a ~ TMVarDefault m a) => proxy m -> TMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: traceTMVarDefault :: MonadTraceSTM m => proxy m -> TMVarDefault m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: traceTMVarIO :: MonadTraceSTM m => TMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM.Internal: traceTQueue :: MonadTraceSTM m => proxy m -> TQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: traceTQueueIO :: MonadTraceSTM m => TQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM.Internal: traceTSem :: (MonadTraceSTM m, TSem m ~ TSemDefault m) => proxy m -> TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: traceTSemIO :: MonadTraceSTM m => TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM.Internal: traceTVar :: MonadTraceSTM m => proxy m -> TVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: traceTVarIO :: MonadTraceSTM m => TVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> m ()
- Control.Monad.Class.MonadSTM.Internal: tryPeekTBQueue :: MonadSTM m => TBQueue m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryPeekTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryPeekTChan :: MonadSTM m => TChan m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryPeekTChanDefault :: MonadSTM m => TChanDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryPeekTQueue :: MonadSTM m => TQueue m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryPeekTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryPutTMVar :: MonadSTM m => TMVar m a -> a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: tryPutTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m Bool
- Control.Monad.Class.MonadSTM.Internal: tryReadTBQueue :: MonadSTM m => TBQueue m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryReadTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryReadTChan :: MonadSTM m => TChan m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryReadTChanDefault :: MonadSTM m => TChanDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryReadTMVar :: MonadSTM m => TMVar m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryReadTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryReadTQueue :: MonadSTM m => TQueue m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryReadTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryTakeTMVar :: MonadSTM m => TMVar m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: tryTakeTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m (Maybe a)
- Control.Monad.Class.MonadSTM.Internal: type InspectMonad m :: Type -> Type;
- Control.Monad.Class.MonadSTM.Internal: type STM m = (stm :: Type -> Type) | stm -> m;
- Control.Monad.Class.MonadSTM.Internal: type TArray m :: Type -> Type -> Type;
- Control.Monad.Class.MonadSTM.Internal: type TBQueue m :: Type -> Type;
- Control.Monad.Class.MonadSTM.Internal: type TChan m :: Type -> Type;
- Control.Monad.Class.MonadSTM.Internal: type TMVar m :: Type -> Type;
- Control.Monad.Class.MonadSTM.Internal: type TQueue m :: Type -> Type;
- Control.Monad.Class.MonadSTM.Internal: type TSem m :: Type;
- Control.Monad.Class.MonadSTM.Internal: type TVar m :: Type -> Type;
- Control.Monad.Class.MonadSTM.Internal: unGetTBQueue :: MonadSTM m => TBQueue m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: unGetTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: unGetTChan :: MonadSTM m => TChan m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: unGetTChanDefault :: MonadSTM m => TChanDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: unGetTQueue :: MonadSTM m => TQueue m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: unGetTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: waitTSem :: MonadSTM m => TSem m -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: waitTSemDefault :: MonadSTM m => TSemDefault m -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTBQueue :: MonadSTM m => TBQueue m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTChan :: MonadSTM m => TChan m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTChanDefault :: MonadSTM m => TChanDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTMVar :: MonadSTM m => TMVar m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTQueue :: MonadSTM m => TQueue m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: writeTVar :: MonadSTM m => TVar m a -> a -> STM m ()
- Control.Monad.Class.MonadSTM.Internal: }
- Control.Monad.Class.MonadSay: class Monad m => MonadSay m
- Control.Monad.Class.MonadSay: instance Control.Monad.Class.MonadSay.MonadSay GHC.Types.IO
- Control.Monad.Class.MonadSay: instance Control.Monad.Class.MonadSay.MonadSay m => Control.Monad.Class.MonadSay.MonadSay (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadSay: say :: MonadSay m => String -> m ()
- Control.Monad.Class.MonadTest: class Monad m => MonadTest m
- Control.Monad.Class.MonadTest: exploreRaces :: MonadTest m => m ()
- Control.Monad.Class.MonadTest: instance Control.Monad.Class.MonadTest.MonadTest GHC.Types.IO
- Control.Monad.Class.MonadTest: instance Control.Monad.Class.MonadTest.MonadTest m => Control.Monad.Class.MonadTest.MonadTest (Control.Monad.Trans.Reader.ReaderT e m)
- Control.Monad.Class.MonadThrow: ExitCaseAbort :: ExitCase a
- Control.Monad.Class.MonadThrow: ExitCaseException :: SomeException -> ExitCase a
- Control.Monad.Class.MonadThrow: ExitCaseSuccess :: a -> ExitCase a
- Control.Monad.Class.MonadThrow: Handler :: (e -> m a) -> Handler m a
- Control.Monad.Class.MonadThrow: MaskedInterruptible :: MaskingState
- Control.Monad.Class.MonadThrow: MaskedUninterruptible :: MaskingState
- Control.Monad.Class.MonadThrow: Unmasked :: MaskingState
- Control.Monad.Class.MonadThrow: allowInterrupt :: MonadMaskingState m => m ()
- Control.Monad.Class.MonadThrow: bracket :: (MonadThrow m, MonadCatch m) => m a -> (a -> m b) -> (a -> m c) -> m c
- Control.Monad.Class.MonadThrow: bracketOnError :: MonadCatch m => m a -> (a -> m b) -> (a -> m c) -> m c
- Control.Monad.Class.MonadThrow: bracket_ :: MonadThrow m => m a -> m b -> m c -> m c
- Control.Monad.Class.MonadThrow: catch :: (MonadCatch m, Exception e) => m a -> (e -> m a) -> m a
- Control.Monad.Class.MonadThrow: catchJust :: (MonadCatch m, Exception e) => (e -> Maybe b) -> m a -> (b -> m a) -> m a
- Control.Monad.Class.MonadThrow: catches :: forall m a. MonadCatch m => m a -> [Handler m a] -> m a
- Control.Monad.Class.MonadThrow: class (Typeable e, Show e) => Exception e
- Control.Monad.Class.MonadThrow: class MonadThrow m => MonadCatch m
- Control.Monad.Class.MonadThrow: class MonadThrow m => MonadEvaluate m
- Control.Monad.Class.MonadThrow: class MonadCatch m => MonadMask m
- Control.Monad.Class.MonadThrow: class MonadMask m => MonadMaskingState m
- Control.Monad.Class.MonadThrow: class Monad m => MonadThrow m
- Control.Monad.Class.MonadThrow: data ExitCase a
- Control.Monad.Class.MonadThrow: data Handler m a
- Control.Monad.Class.MonadThrow: data () => MaskingState
- Control.Monad.Class.MonadThrow: data () => SomeException
- Control.Monad.Class.MonadThrow: displayException :: Exception e => e -> String
- Control.Monad.Class.MonadThrow: evaluate :: MonadEvaluate m => a -> m a
- Control.Monad.Class.MonadThrow: finally :: MonadThrow m => m a -> m b -> m a
- Control.Monad.Class.MonadThrow: fromException :: Exception e => SomeException -> Maybe e
- Control.Monad.Class.MonadThrow: generalBracket :: (MonadCatch m, MonadMask m) => m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c)
- Control.Monad.Class.MonadThrow: getMaskingState :: MonadMaskingState m => m MaskingState
- Control.Monad.Class.MonadThrow: handle :: (MonadCatch m, Exception e) => (e -> m a) -> m a -> m a
- Control.Monad.Class.MonadThrow: handleJust :: (MonadCatch m, Exception e) => (e -> Maybe b) -> (b -> m a) -> m a -> m a
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadCatch GHC.Conc.Sync.STM
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadCatch GHC.Types.IO
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadCatch m => Control.Monad.Class.MonadThrow.MonadCatch (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadEvaluate GHC.Types.IO
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadEvaluate m => Control.Monad.Class.MonadThrow.MonadEvaluate (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadMask GHC.Types.IO
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadMask m => Control.Monad.Class.MonadThrow.MonadMask (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadMaskingState GHC.Types.IO
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadThrow GHC.Conc.Sync.STM
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadThrow GHC.Types.IO
- Control.Monad.Class.MonadThrow: instance Control.Monad.Class.MonadThrow.MonadThrow m => Control.Monad.Class.MonadThrow.MonadThrow (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadThrow: instance GHC.Base.Functor Control.Monad.Class.MonadThrow.ExitCase
- Control.Monad.Class.MonadThrow: instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.Class.MonadThrow.Handler m)
- Control.Monad.Class.MonadThrow: instance GHC.Show.Show a => GHC.Show.Show (Control.Monad.Class.MonadThrow.ExitCase a)
- Control.Monad.Class.MonadThrow: interruptible :: MonadMaskingState m => m a -> m a
- Control.Monad.Class.MonadThrow: mask :: MonadMask m => ((forall a. m a -> m a) -> m b) -> m b
- Control.Monad.Class.MonadThrow: mask_ :: MonadMask m => m a -> m a
- Control.Monad.Class.MonadThrow: onException :: MonadCatch m => m a -> m b -> m a
- Control.Monad.Class.MonadThrow: throwIO :: (MonadThrow m, Exception e) => e -> m a
- Control.Monad.Class.MonadThrow: toException :: Exception e => e -> SomeException
- Control.Monad.Class.MonadThrow: try :: (MonadCatch m, Exception e) => m a -> m (Either e a)
- Control.Monad.Class.MonadThrow: tryJust :: (MonadCatch m, Exception e) => (e -> Maybe b) -> m a -> m (Either b a)
- Control.Monad.Class.MonadThrow: uninterruptibleMask :: MonadMask m => ((forall a. m a -> m a) -> m b) -> m b
- Control.Monad.Class.MonadThrow: uninterruptibleMask_ :: MonadMask m => m a -> m a
- Control.Monad.Class.MonadTime: addUTCTime :: NominalDiffTime -> UTCTime -> UTCTime
- Control.Monad.Class.MonadTime: class Monad m => MonadMonotonicTimeNSec m
- Control.Monad.Class.MonadTime: class Monad m => MonadTime m
- Control.Monad.Class.MonadTime: data () => NominalDiffTime
- Control.Monad.Class.MonadTime: data () => UTCTime
- Control.Monad.Class.MonadTime: diffUTCTime :: UTCTime -> UTCTime -> NominalDiffTime
- Control.Monad.Class.MonadTime: getCurrentTime :: MonadTime m => m UTCTime
- Control.Monad.Class.MonadTime: getMonotonicTimeNSec :: MonadMonotonicTimeNSec m => m Word64
- Control.Monad.Class.MonadTime: instance Control.Monad.Class.MonadTime.MonadMonotonicTimeNSec GHC.Types.IO
- Control.Monad.Class.MonadTime: instance Control.Monad.Class.MonadTime.MonadMonotonicTimeNSec m => Control.Monad.Class.MonadTime.MonadMonotonicTimeNSec (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadTime: instance Control.Monad.Class.MonadTime.MonadTime GHC.Types.IO
- Control.Monad.Class.MonadTime: instance Control.Monad.Class.MonadTime.MonadTime m => Control.Monad.Class.MonadTime.MonadTime (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadTimer: class Monad m => MonadDelay m
- Control.Monad.Class.MonadTimer: class (MonadDelay m, MonadSTM m) => MonadTimer m
- Control.Monad.Class.MonadTimer: instance Control.Monad.Class.MonadTimer.MonadDelay GHC.Types.IO
- Control.Monad.Class.MonadTimer: instance Control.Monad.Class.MonadTimer.MonadDelay m => Control.Monad.Class.MonadTimer.MonadDelay (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadTimer: instance Control.Monad.Class.MonadTimer.MonadTimer GHC.Types.IO
- Control.Monad.Class.MonadTimer: instance Control.Monad.Class.MonadTimer.MonadTimer m => Control.Monad.Class.MonadTimer.MonadTimer (Control.Monad.Trans.Reader.ReaderT r m)
- Control.Monad.Class.MonadTimer: registerDelay :: MonadTimer m => Int -> m (TVar m Bool)
- Control.Monad.Class.MonadTimer: threadDelay :: MonadDelay m => Int -> m ()
- Control.Monad.Class.MonadTimer: timeout :: MonadTimer m => Int -> m a -> m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: [TraceValue] :: forall tr. Typeable tr => Maybe tr -> Maybe String -> TraceValue
+ Control.Concurrent.Class.MonadSTM.Strict: atomically :: (MonadSTM m, HasCallStack) => STM m a -> m a
+ Control.Concurrent.Class.MonadSTM.Strict: castStrictTBQueue :: LazyTBQueue m ~ LazyTBQueue n => StrictTBQueue m a -> StrictTBQueue n a
+ Control.Concurrent.Class.MonadSTM.Strict: castStrictTChan :: LazyTChan m ~ LazyTChan n => StrictTChan m a -> StrictTChan n a
+ Control.Concurrent.Class.MonadSTM.Strict: castStrictTMVar :: LazyTMVar m ~ LazyTMVar n => StrictTMVar m a -> StrictTMVar n a
+ Control.Concurrent.Class.MonadSTM.Strict: castStrictTQueue :: LazyTQueue m ~ LazyTQueue n => StrictTQueue m a -> StrictTQueue n a
+ Control.Concurrent.Class.MonadSTM.Strict: castStrictTVar :: LazyTVar m ~ LazyTVar n => StrictTVar m a -> StrictTVar n a
+ Control.Concurrent.Class.MonadSTM.Strict: check :: MonadSTM m => Bool -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: class (MonadSTM m, Monad InspectMonad m) => MonadInspectSTM (m :: Type -> Type) where {
+ Control.Concurrent.Class.MonadSTM.Strict: class MonadSTM m => MonadLabelledSTM (m :: Type -> Type)
+ Control.Concurrent.Class.MonadSTM.Strict: class (Monad m, Monad STM m) => MonadSTM (m :: Type -> Type) where {
+ Control.Concurrent.Class.MonadSTM.Strict: class MonadInspectSTM m => MonadTraceSTM (m :: Type -> Type)
+ Control.Concurrent.Class.MonadSTM.Strict: cloneTChan :: MonadSTM m => StrictTChan m a -> STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict: data StrictTArray m i e
+ Control.Concurrent.Class.MonadSTM.Strict: data StrictTBQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict: data StrictTChan m a
+ Control.Concurrent.Class.MonadSTM.Strict: data StrictTMVar m a
+ Control.Concurrent.Class.MonadSTM.Strict: data StrictTQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict: data StrictTVar m a
+ Control.Concurrent.Class.MonadSTM.Strict: data () => TraceValue
+ Control.Concurrent.Class.MonadSTM.Strict: dupTChan :: MonadSTM m => StrictTChan m a -> STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict: flushTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m [a]
+ Control.Concurrent.Class.MonadSTM.Strict: flushTQueue :: MonadSTM m => StrictTQueue m a -> STM m [a]
+ Control.Concurrent.Class.MonadSTM.Strict: fromLazyTArray :: LazyTArray m i e -> StrictTArray m i e
+ Control.Concurrent.Class.MonadSTM.Strict: fromLazyTBQueue :: LazyTBQueue m a -> StrictTBQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict: fromLazyTChan :: LazyTChan m a -> StrictTChan m a
+ Control.Concurrent.Class.MonadSTM.Strict: fromLazyTMVar :: LazyTMVar m a -> StrictTMVar m a
+ Control.Concurrent.Class.MonadSTM.Strict: fromLazyTQueue :: LazyTQueue m a -> StrictTQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict: fromLazyTVar :: LazyTVar m a -> StrictTVar m a
+ Control.Concurrent.Class.MonadSTM.Strict: inspectTMVar :: MonadInspectSTM m => proxy m -> TMVar m a -> InspectMonad m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: inspectTVar :: MonadInspectSTM m => proxy m -> TVar m a -> InspectMonad m a
+ Control.Concurrent.Class.MonadSTM.Strict: isEmptyTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict: isEmptyTChan :: MonadSTM m => StrictTChan m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict: isEmptyTMVar :: MonadSTM m => StrictTMVar m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict: isEmptyTQueue :: MonadSTM m => StrictTQueue m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict: isFullTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict: labelTBQueue :: MonadLabelledSTM m => StrictTBQueue m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: labelTBQueueIO :: MonadLabelledSTM m => StrictTBQueue m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: labelTMVar :: MonadLabelledSTM m => StrictTMVar m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: labelTMVarIO :: MonadLabelledSTM m => StrictTMVar m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: labelTQueue :: MonadLabelledSTM m => StrictTQueue m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: labelTQueueIO :: MonadLabelledSTM m => StrictTQueue m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: labelTVar :: MonadLabelledSTM m => StrictTVar m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: labelTVarIO :: MonadLabelledSTM m => StrictTVar m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: lengthTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Natural
+ Control.Concurrent.Class.MonadSTM.Strict: modifyTVar :: MonadSTM m => StrictTVar m a -> (a -> a) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: newBroadcastTChan :: MonadSTM m => STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newEmptyTMVar :: MonadSTM m => STM m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newEmptyTMVarIO :: MonadSTM m => m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTBQueue :: MonadSTM m => Natural -> STM m (StrictTBQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTBQueueIO :: MonadSTM m => Natural -> m (StrictTBQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTChan :: MonadSTM m => STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTMVar :: MonadSTM m => a -> STM m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTMVarIO :: MonadSTM m => a -> m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTQueue :: MonadSTM m => STM m (StrictTQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTQueueIO :: MonadSTM m => m (StrictTQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTVar :: MonadSTM m => a -> STM m (StrictTVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict: newTVarIO :: MonadSTM m => a -> m (StrictTVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict: orElse :: MonadSTM m => STM m a -> STM m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: pattern DontTrace :: TraceValue
+ Control.Concurrent.Class.MonadSTM.Strict: pattern TraceString :: String -> TraceValue
+ Control.Concurrent.Class.MonadSTM.Strict: pattern TraceDynamic :: () => Typeable tr => tr -> TraceValue
+ Control.Concurrent.Class.MonadSTM.Strict: peekTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: peekTChan :: MonadSTM m => StrictTChan m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: peekTQueue :: MonadSTM m => StrictTQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: putTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: readTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: readTChan :: MonadSTM m => StrictTChan m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: readTMVar :: MonadSTM m => StrictTMVar m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: readTQueue :: MonadSTM m => StrictTQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: readTVar :: MonadSTM m => StrictTVar m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: readTVarIO :: MonadSTM m => StrictTVar m a -> m a
+ Control.Concurrent.Class.MonadSTM.Strict: retry :: MonadSTM m => STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: stateTVar :: MonadSTM m => StrictTVar m s -> (s -> (a, s)) -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: swapTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: swapTVar :: MonadSTM m => StrictTVar m a -> a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: takeTMVar :: MonadSTM m => StrictTMVar m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: throwSTM :: forall (m :: Type -> Type) e a. (MonadSTM m, MonadThrow (STM m), Exception e) => e -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict: toLazyTVar :: StrictTVar m a -> LazyTVar m a
+ Control.Concurrent.Class.MonadSTM.Strict: traceTBQueue :: MonadTraceSTM m => proxy m -> StrictTBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTBQueueIO :: MonadTraceSTM m => StrictTBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTMVar :: MonadTraceSTM m => proxy m -> StrictTMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTMVarIO :: MonadTraceSTM m => StrictTMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTQueue :: MonadTraceSTM m => proxy m -> StrictTQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTQueueIO :: MonadTraceSTM m => StrictTQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTSem :: MonadTraceSTM m => proxy m -> TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTSemIO :: MonadTraceSTM m => TSem m -> (Maybe Integer -> Integer -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTVar :: MonadTraceSTM m => proxy m -> StrictTVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: traceTVarIO :: MonadTraceSTM m => StrictTVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict: tryPeekTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: tryPeekTChan :: MonadSTM m => StrictTChan m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: tryPeekTQueue :: MonadSTM m => StrictTQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: tryPutTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict: tryReadTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: tryReadTChan :: MonadSTM m => StrictTChan m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: tryReadTMVar :: MonadSTM m => StrictTMVar m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: tryReadTQueue :: MonadSTM m => StrictTQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: tryTakeTMVar :: MonadSTM m => StrictTMVar m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict: type LazyTArray m = TArray m
+ Control.Concurrent.Class.MonadSTM.Strict: type LazyTBQueue m = TBQueue m
+ Control.Concurrent.Class.MonadSTM.Strict: type LazyTChan m = TChan m
+ Control.Concurrent.Class.MonadSTM.Strict: type LazyTMVar m = TMVar m
+ Control.Concurrent.Class.MonadSTM.Strict: type LazyTQueue m = TQueue m
+ Control.Concurrent.Class.MonadSTM.Strict: type LazyTVar m = TVar m
+ Control.Concurrent.Class.MonadSTM.Strict: type family InspectMonad (m :: Type -> Type) :: Type -> Type
+ Control.Concurrent.Class.MonadSTM.Strict: unGetTBQueue :: MonadSTM m => StrictTBQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: unGetTChan :: MonadSTM m => StrictTChan m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: unGetTQueue :: MonadSTM m => StrictTQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: writeTBQueue :: MonadSTM m => StrictTBQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: writeTChan :: MonadSTM m => StrictTChan m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: writeTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: writeTQueue :: MonadSTM m => StrictTQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: writeTVar :: MonadSTM m => StrictTVar m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict: }
+ Control.Concurrent.Class.MonadSTM.Strict.TArray: data StrictTArray m i e
+ Control.Concurrent.Class.MonadSTM.Strict.TArray: fromLazyTArray :: LazyTArray m i e -> StrictTArray m i e
+ Control.Concurrent.Class.MonadSTM.Strict.TArray: instance (Data.Array.Base.MArray (Control.Monad.Class.MonadSTM.Internal.TArray m) e stm, GHC.Base.Monad stm) => Data.Array.Base.MArray (Control.Concurrent.Class.MonadSTM.Strict.TArray.StrictTArray m) e stm
+ Control.Concurrent.Class.MonadSTM.Strict.TArray: toLazyTArray :: StrictTArray m i e -> LazyTArray m i e
+ Control.Concurrent.Class.MonadSTM.Strict.TArray: type LazyTArray m = TArray m
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: castStrictTBQueue :: LazyTBQueue m ~ LazyTBQueue n => StrictTBQueue m a -> StrictTBQueue n a
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: data StrictTBQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: flushTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m [a]
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: fromLazyTBQueue :: LazyTBQueue m a -> StrictTBQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: isEmptyTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: isFullTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: labelTBQueue :: MonadLabelledSTM m => StrictTBQueue m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: labelTBQueueIO :: MonadLabelledSTM m => StrictTBQueue m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: lengthTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Natural
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: newTBQueue :: MonadSTM m => Natural -> STM m (StrictTBQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: newTBQueueIO :: MonadSTM m => Natural -> m (StrictTBQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: peekTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: readTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: toLazyTBQueue :: StrictTBQueue m a -> LazyTBQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: traceTBQueue :: MonadTraceSTM m => proxy m -> StrictTBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: traceTBQueueIO :: MonadTraceSTM m => StrictTBQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: tryPeekTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: tryReadTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: type LazyTBQueue m = TBQueue m
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: unGetTBQueue :: MonadSTM m => StrictTBQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue: writeTBQueue :: MonadSTM m => StrictTBQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: castStrictTChan :: LazyTChan m ~ LazyTChan n => StrictTChan m a -> StrictTChan n a
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: cloneTChan :: MonadSTM m => StrictTChan m a -> STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: data StrictTChan m a
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: dupTChan :: MonadSTM m => StrictTChan m a -> STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: fromLazyTChan :: LazyTChan m a -> StrictTChan m a
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: isEmptyTChan :: MonadSTM m => StrictTChan m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: newBroadcastTChan :: MonadSTM m => STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: newTChan :: MonadSTM m => STM m (StrictTChan m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: peekTChan :: MonadSTM m => StrictTChan m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: readTChan :: MonadSTM m => StrictTChan m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: toLazyTChan :: StrictTChan m a -> LazyTChan m a
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: tryPeekTChan :: MonadSTM m => StrictTChan m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: tryReadTChan :: MonadSTM m => StrictTChan m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: type LazyTChan m = TChan m
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: unGetTChan :: MonadSTM m => StrictTChan m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TChan: writeTChan :: MonadSTM m => StrictTChan m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: castStrictTMVar :: LazyTMVar m ~ LazyTMVar n => StrictTMVar m a -> StrictTMVar n a
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: data StrictTMVar m a
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: fromLazyTMVar :: LazyTMVar m a -> StrictTMVar m a
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: isEmptyTMVar :: MonadSTM m => StrictTMVar m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: labelTMVar :: MonadLabelledSTM m => StrictTMVar m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: labelTMVarIO :: MonadLabelledSTM m => StrictTMVar m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: newEmptyTMVar :: MonadSTM m => STM m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: newEmptyTMVarIO :: MonadSTM m => m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: newTMVar :: MonadSTM m => a -> STM m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: newTMVarIO :: MonadSTM m => a -> m (StrictTMVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: putTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: readTMVar :: MonadSTM m => StrictTMVar m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: swapTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: takeTMVar :: MonadSTM m => StrictTMVar m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: toLazyTMVar :: StrictTMVar m a -> LazyTMVar m a
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: traceTMVar :: MonadTraceSTM m => proxy m -> StrictTMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: traceTMVarIO :: MonadTraceSTM m => StrictTMVar m a -> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: tryPutTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: tryReadTMVar :: MonadSTM m => StrictTMVar m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: tryTakeTMVar :: MonadSTM m => StrictTMVar m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: type LazyTMVar m = TMVar m
+ Control.Concurrent.Class.MonadSTM.Strict.TMVar: writeTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: castStrictTQueue :: LazyTQueue m ~ LazyTQueue n => StrictTQueue m a -> StrictTQueue n a
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: data StrictTQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: flushTQueue :: MonadSTM m => StrictTQueue m a -> STM m [a]
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: fromLazyTQueue :: LazyTQueue m a -> StrictTQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: isEmptyTQueue :: MonadSTM m => StrictTQueue m a -> STM m Bool
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: labelTQueue :: MonadLabelledSTM m => StrictTQueue m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: labelTQueueIO :: MonadLabelledSTM m => StrictTQueue m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: newTQueue :: MonadSTM m => STM m (StrictTQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: newTQueueIO :: MonadSTM m => m (StrictTQueue m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: peekTQueue :: MonadSTM m => StrictTQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: readTQueue :: MonadSTM m => StrictTQueue m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: toLazyTQueue :: StrictTQueue m a -> LazyTQueue m a
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: traceTQueue :: MonadTraceSTM m => proxy m -> StrictTQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: traceTQueueIO :: MonadTraceSTM m => StrictTQueue m a -> (Maybe [a] -> [a] -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: tryPeekTQueue :: MonadSTM m => StrictTQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: tryReadTQueue :: MonadSTM m => StrictTQueue m a -> STM m (Maybe a)
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: type LazyTQueue m = TQueue m
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: unGetTQueue :: MonadSTM m => StrictTQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TQueue: writeTQueue :: MonadSTM m => StrictTQueue m a -> a -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: castStrictTVar :: LazyTVar m ~ LazyTVar n => StrictTVar m a -> StrictTVar n a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: check :: MonadSTM m => Bool -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: data StrictTVar m a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: fromLazyTVar :: LazyTVar m a -> StrictTVar m a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: labelTVar :: MonadLabelledSTM m => StrictTVar m a -> String -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: labelTVarIO :: MonadLabelledSTM m => StrictTVar m a -> String -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: modifyTVar :: MonadSTM m => StrictTVar m a -> (a -> a) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: newTVar :: MonadSTM m => a -> STM m (StrictTVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: newTVarIO :: MonadSTM m => a -> m (StrictTVar m a)
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: readTVar :: MonadSTM m => StrictTVar m a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: readTVarIO :: MonadSTM m => StrictTVar m a -> m a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: stateTVar :: MonadSTM m => StrictTVar m s -> (s -> (a, s)) -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: swapTVar :: MonadSTM m => StrictTVar m a -> a -> STM m a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: toLazyTVar :: StrictTVar m a -> LazyTVar m a
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: traceTVar :: MonadTraceSTM m => proxy m -> StrictTVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> STM m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: traceTVarIO :: MonadTraceSTM m => StrictTVar m a -> (Maybe a -> a -> InspectMonad m TraceValue) -> m ()
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: type LazyTVar m = TVar m
+ Control.Concurrent.Class.MonadSTM.Strict.TVar: writeTVar :: MonadSTM m => StrictTVar m a -> a -> STM m ()
Files
- CHANGELOG.md +20/−0
- README.md +37/−18
- io-classes.cabal +168/−10
- mtl/Control/Monad/Class/MonadEventlog/Trans.hs +56/−0
- mtl/Control/Monad/Class/MonadST/Trans.hs +48/−0
- mtl/Control/Monad/Class/MonadSTM/Trans.hs +711/−0
- mtl/Control/Monad/Class/MonadSay/Trans.hs +30/−0
- mtl/Control/Monad/Class/MonadThrow/Trans.hs +329/−0
- mtl/Control/Monad/Class/MonadTime/SI/Trans.hs +40/−0
- mtl/Control/Monad/Class/MonadTime/Trans.hs +63/−0
- mtl/Control/Monad/Class/MonadTimer/SI/Trans.hs +66/−0
- mtl/Control/Monad/Class/MonadTimer/Trans.hs +92/−0
- mtl/Control/Monad/Class/Trans.hs +13/−0
- si-timers/src/Control/Monad/Class/MonadTime/SI.hs +76/−0
- si-timers/src/Control/Monad/Class/MonadTimer/NonStandard.hs +168/−0
- si-timers/src/Control/Monad/Class/MonadTimer/SI.hs +273/−0
- si-timers/test/Main.hs +15/−0
- si-timers/test/Test/MonadTimer.hs +90/−0
- src/Control/Monad/Class/MonadThrow.hs +3/−0
- strict-mvar/README.md +7/−0
- strict-mvar/src/Control/Concurrent/Class/MonadMVar/Strict.hs +127/−0
- strict-mvar/test/Main.hs +35/−0
- strict-stm/Control/Concurrent/Class/MonadSTM/Strict.hs +15/−0
- strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TArray.hs +41/−0
- strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TBQueue.hs +106/−0
- strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TChan.hs +75/−0
- strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TMVar.hs +109/−0
- strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TQueue.hs +98/−0
- strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TVar.hs +108/−0
- strict-stm/README.md +18/−0
- test/Test/Control/Concurrent/Class/MonadMVar/Strict/WHNF.hs +123/−0
CHANGELOG.md view
@@ -1,5 +1,12 @@ # Revsion history of io-classes +### 1.6.0.0++### Breaking changes++* `strict-stm`, `strict-mvar` and `si-timers` are now public sublibraries of `io-classes` package.+* Moved `io-classes-mtl` to `io-classes` as a public sublibrary.+ ## 1.5.0.0 ### Breaking changes@@ -11,6 +18,19 @@ ### Non-breaking change * Add `writeTMVar` to `MonadSTM`.++* `strict-stm`, `strict-mvar` and `si-timers` were moved to `io-classes` as+ **public sublibraries**. You can import then in `*.cabal` files with the+ following syntax `io-classes:strict-stm` or `io-classes:{strict-stm,+ si-timers}`. See the _Multiple public libraries_ subsection of [_Internal+ Libraries_][sublibs] section in the `cabal` documentation.++ Note: some time in the future we will deprecate `Hackage` packages+ `strict-stm`, `strict-mvar` and `si-timers`. If one will want to use the+ namespace for a non `io-classes` related packages please contact the+ maintainer.++[sublibs]: https://cabal.readthedocs.io/en/stable/cabal-package.html#sublibs ## 1.4.1.0
README.md view
@@ -1,4 +1,4 @@-# IO Monad Class Hierarchy+# IO Monad Class Hierarchy: `io-classes` This package provides a monad class hierarchy which is an interface for both the [`io-sim`] and [`IO`] monads. It was developed with the following@@ -10,18 +10,35 @@ as timer API; * provide zero-cost abstractions. -We provide also non-standard extensions of this API:+We provide also non-standard extensions of this API in **sublibraries**: -* [`strict-stm`]: strict `TVar`'s, and other mutable `STM` variables, with+* [`io-classes:strict-stm`](https://input-output-hk.github.io/io-sim/io-classes/strict-stm/index.html) strict `TVar`'s, and other mutable `STM` variables, with support of the [`nothunks`] library;-* [`si-timers`]: timers api:+* [`io-classes:strict-mvar`](https://input-output-hk.github.io/io-sim/io-classes/strict-mvar/index.html): strict `MVar`s+* [`io-classes:si-timers`](https://input-output-hk.github.io/io-sim/io-classes/si-timers/index.html): timers api:+ - 32-bit safe API using `DiffTime` measured in seconds (rather than time in microseconds represented as `Int` as in `base`) - cancellable timeouts. -[`strict-stm`] and [`nothunks`] were successfully used in a large code base to-eliminate space leaks and keep that property over long development cycles.+* [`io-classes:io-classes-mtl`](https://input-output-hk.github.io/io-sim/io-classes/io-classes-mtl/index.html):+ MTL instances. +[`io-classes:strict-stm`](https://input-output-hk.github.io/io-sim/io-classes/strict-stm/index.html)+and [`nothunks`] were successfully used in a large+code base to eliminate space leaks and keep that property over long development+cycles.++## Documentation++Hackage doesn't yet support public sublibraries, thus Haddocks are published+[here][io-classes-haddocks].++### Support material++* [Philipp Kant (@kantp) at Bobconf 2022][bob-conf]+* [Armando Santos (@bolt12) at ZuriHac 2022][zuriHac-2022]+ ## Exception Class Hierarchy This package provides an alternative class hierarchy giving access to@@ -61,24 +78,23 @@ ## Software Transactional Memory API We provide two interfaces to `stm` API: lazy, included in `io-classes`; and-strict one provided by [`strict-stm`].-+strict one provided by [`io-classes:strict-stm`](https://input-output-hk.github.io/io-sim/io-classes/strict-stm/index.html). ## Threads API We draw a line between `base` API and `async` API. The former is provided by [MonadFork](https://hackage.haskell.org/package/io-classes/docs/Control-Monad-Class-MonadFork.html#t:MonadFork) the latter by-[MonadAsync](https://hackage.haskell.org/package/io-classes/docs/Control-Monad-Class-MonadFork.html#t:MonadAsync).+[MonadAsync](https://hackage.haskell.org/package/io-classes/docs/Control-Monad-Class-MonadAsync.html#t:MonadAsync). Both are shallow abstractions around APIs exposed by the `base` and `async` packages. ## Some other APIs -* [MonadEventlog]: provides an API to the [Debug.Trace] event log interface.-* [MonadST]: provides a way to lift `ST`-computations.-* [MonadSay]: dummy debugging interface+* [MonadEventlog][MonadEventlog]: provides an API to the [Debug.Trace] event log interface.+* [MonadST][MonadST]: provides a way to lift `ST`-computations.+* [MonadSay][MonadSay]: dummy debugging interface ## Differences from `base`, `async`, or `exceptions` packages @@ -140,17 +156,20 @@ [`base`]: https://hackage.haskell.org/package/base [`exceptions`]: https://hackage.haskell.org/package/exceptions [`io-sim`]: https://hackage.haskell.org/package/io-sim-[`si-timers`]: https://hackage.haskell.org/package/si-timers+[io-classes:mtl]: https://input-output-hk.github.io/io-sim/io-classes/mtl/index.html [`stm`]: https://hackage.haskell.org/package/stm-[`strict-stm`]: https://hackage.haskell.org/package/strict-stm-[`threadDelay`]: https://hackage.haskell.org/package/io-classes/docs/Control-Monad-Class-MonadTimer.html#v:threadDela+[`threadDelay`]: https://hackage.haskell.org/package/io-classes/docs/Control-Monad-Class-MonadTimer.html#v:threadDelay [`time`]: https://hackage.haskell.org/package/time [contributing]: https://www.github.com/input-output-hk/io-sim/tree/master/CONTRIBUTING.md [`nothunks`]: https://hackage.haskell.org/package/nothunks [labelThread-base]: https://hackage.haskell.org/package/base-4.17.0.0/docs/GHC-Conc-Sync.html#v:labelThread [io-deadlock]: https://hackage.haskell.org/package/base-4.19.0.0/docs/Control-Exception.html#t:Deadlock -[MonadEventlog]: https://hackage.haskell.org/package/io-sim-classes/docs/Control-Monad-Class-MonadEventlog.html#t:MonadEventlog+[MonadEventlog]: https://input-output-hk.github.io/io-sim/io-classes/Control-Monad-Class-MonadEventlog.html#t:MonadEventlog [Debug.Trace]: https://hackage.haskell.org/package/base/docs/Debug-Trace.html-[MonadST]: https://hackage.haskell.org/package/io-classes/docs/Control-Monad-Class-MonadST.html#t:MonadST-[MonadSay]: https://hackage.haskell.org/package/io-classes/docs/Control-Monad-Class-MonadSay.html#t:MonadSay+[MonadST]: https://input-output-hk.github.io/io-sim/io-classes/Control-Monad-Class-MonadST.html#t:MonadST+[MonadSay]: https://input-output-hk.github.io/io-sim/io-classes/Control-Monad-Class-MonadSay.html#t:MonadSay+[io-classes-haddocks]: https://input-output-hk.github.io/io-sim++[bob-conf]: https://youtu.be/uedUGeWN4ZM+[zuriHac-2022]: https://youtu.be/tKIYQgJnGkA
io-classes.cabal view
@@ -1,15 +1,19 @@ cabal-version: 3.0 name: io-classes-version: 1.5.0.0+version: 1.6.0.0 synopsis: Type classes for concurrency with STM, ST and timing description:- IO Monad class hierarchy compatible with- [io-sim](https://hackage.haskell.org/package/io-sim),- [base](https://hackage.haskell.org/package/base),- [async](https://hackage.haskell.org/package/async),- [stm](https://hackage.haskell.org/package/stm),- [exceptions](https://hackage.haskell.org/package/exceptions) &- [time](https://hackage.haskell.org/package/time) packages.+ IO Monad class hierarchy compatible with:++ * [io-sim](https://hackage.haskell.org/package/io-sim),+ * [base](https://hackage.haskell.org/package/base),+ * [async](https://hackage.haskell.org/package/async),+ * [stm](https://hackage.haskell.org/package/stm),+ * [exceptions](https://hackage.haskell.org/package/exceptions) &+ * [time](https://hackage.haskell.org/package/time)++ packages.+ license: Apache-2.0 license-files: LICENSE NOTICE copyright: 2019-2024 Input Output Global Inc (IOG)@@ -17,7 +21,7 @@ maintainer: Duncan Coutts duncan@well-typed.com, Marcin Szamotulski coot@coot.me category: Control build-type: Simple-extra-doc-files: CHANGELOG.md README.md+extra-doc-files: CHANGELOG.md README.md strict-stm/README.md strict-mvar/README.md bug-reports: https://github.com/input-output-hk/io-sim/issues tested-with: GHC == { 8.10, 9.2, 9.4, 9.6, 9.8, 9.10 } @@ -99,10 +103,164 @@ bytestring, mtl >=2.2 && <2.4, primitive >= 0.7 && <0.11,- stm >=2.5 && <2.6,+ stm >=2.5 && <2.5.2 || >=2.5.3 && <2.6, time >=1.9.1 && <1.13 if impl(ghc >= 9.10) build-depends: ghc-internal if flag(asserts) ghc-options: -fno-ignore-asserts++library strict-stm+ visibility: public+ hs-source-dirs: strict-stm++ exposed-modules: Control.Concurrent.Class.MonadSTM.Strict+ Control.Concurrent.Class.MonadSTM.Strict.TArray+ Control.Concurrent.Class.MonadSTM.Strict.TBQueue+ Control.Concurrent.Class.MonadSTM.Strict.TChan+ Control.Concurrent.Class.MonadSTM.Strict.TMVar+ Control.Concurrent.Class.MonadSTM.Strict.TQueue+ Control.Concurrent.Class.MonadSTM.Strict.TVar+ reexported-modules: Control.Concurrent.Class.MonadSTM.TSem as Control.Concurrent.Class.MonadSTM.Strict.TSem+ default-language: Haskell2010+ default-extensions: ImportQualifiedPost+ build-depends: base >= 4.9 && <4.21,+ array,+ stm >= 2.5 && <2.6,++ io-classes:io-classes,+ ghc-options: -Wall+ -Wno-unticked-promoted-constructors+ -Wcompat+ -Wincomplete-uni-patterns+ -Wincomplete-record-updates+ -Wpartial-fields+ -Widentities++ if flag(asserts)+ ghc-options: -fno-ignore-asserts++library strict-mvar+ visibility: public+ hs-source-dirs: strict-mvar/src++ exposed-modules: Control.Concurrent.Class.MonadMVar.Strict+ default-language: Haskell2010+ default-extensions: ImportQualifiedPost+ build-depends: base >= 4.9 && <4.21,+ io-classes:io-classes,+ ghc-options: -Wall+ -Wno-unticked-promoted-constructors+ -Wcompat+ -Wincomplete-uni-patterns+ -Wincomplete-record-updates+ -Wpartial-fields+ -Widentities++library si-timers+ import: warnings+ visibility: public+ hs-source-dirs: si-timers/src+ exposed-modules: Control.Monad.Class.MonadTime.SI+ Control.Monad.Class.MonadTimer.SI+ other-modules: Control.Monad.Class.MonadTimer.NonStandard+ default-language: Haskell2010+ default-extensions: ImportQualifiedPost+ other-extensions: BangPatterns,+ CPP,+ ConstraintKinds,+ DefaultSignatures,+ DeriveGeneric,+ NumericUnderscores,+ ScopedTypeVariables,+ TypeFamilies+ build-depends: base >=4.9 && <4.21,+ deepseq,+ mtl,+ nothunks,+ stm,+ time >=1.9.1 && <1.13,++ io-classes:io-classes+ if flag(asserts)+ ghc-options: -fno-ignore-asserts++-- https://github.com/haskell/cabal/issues/10277+library io-classes-mtl+ import: warnings+ visibility: public+ exposed-modules: Control.Monad.Class.Trans+ , Control.Monad.Class.MonadEventlog.Trans+ , Control.Monad.Class.MonadSay.Trans+ , Control.Monad.Class.MonadST.Trans+ , Control.Monad.Class.MonadSTM.Trans+ , Control.Monad.Class.MonadThrow.Trans+ , Control.Monad.Class.MonadTime.Trans+ , Control.Monad.Class.MonadTime.SI.Trans+ , Control.Monad.Class.MonadTimer.Trans+ , Control.Monad.Class.MonadTimer.SI.Trans+ build-depends: base >=4.9 && <4.21,+ array,+ mtl,++ io-classes:{io-classes,si-timers}++ hs-source-dirs: mtl+ default-language: Haskell2010+ default-extensions: ImportQualifiedPost++library testlib+ import: warnings+ visibility: public+ hs-source-dirs: test+ exposed-modules: Test.Control.Concurrent.Class.MonadMVar.Strict.WHNF+ default-language: Haskell2010+ default-extensions: ImportQualifiedPost+ build-depends: base >=4.9 && <4.21,+ nothunks,+ QuickCheck,+ io-classes:strict-mvar+ if flag(asserts)+ ghc-options: -fno-ignore-asserts++test-suite test-strict-mvar+ type: exitcode-stdio-1.0+ hs-source-dirs: strict-mvar/test+ main-is: Main.hs++ default-language: Haskell2010+ default-extensions: ImportQualifiedPost+ build-depends: base,+ QuickCheck,+ tasty,+ tasty-quickcheck,+ io-classes:testlib++ ghc-options: -Wall+ -Wno-unticked-promoted-constructors+ -Wcompat+ -Wincomplete-uni-patterns+ -Wincomplete-record-updates+ -Wpartial-fields+ -Widentities+ -fno-ignore-asserts++-- Since `io-sim` depends on `si-times` (`io-sim` depends on `Time`) some tests of+-- are in `io-sim:test`: this is a good enough reason to pull `io-sim:test`+-- into a seprate package.+test-suite test-si-timers+ import: warnings+ type: exitcode-stdio-1.0+ hs-source-dirs: si-timers/test+ main-is: Main.hs+ other-modules: Test.MonadTimer+ default-language: Haskell2010+ default-extensions: ImportQualifiedPost+ build-depends: base,++ QuickCheck,+ tasty,+ tasty-quickcheck,++ si-timers
+ mtl/Control/Monad/Class/MonadEventlog/Trans.hs view
@@ -0,0 +1,56 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Control.Monad.Class.MonadEventlog.Trans () where++import Control.Monad.Cont (ContT)+import Control.Monad.Except (ExceptT)+import Control.Monad.RWS.Lazy qualified as Lazy+import Control.Monad.RWS.Strict qualified as Strict+import Control.Monad.State.Lazy qualified as Lazy+import Control.Monad.State.Strict qualified as Strict+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy qualified as Lazy+import Control.Monad.Writer.Strict qualified as Strict++import Control.Monad.Class.MonadEventlog++-- | @since 0.1.0.0+instance MonadEventlog m => MonadEventlog (ContT r m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO++-- | @since 0.1.0.0+instance MonadEventlog m => MonadEventlog (ExceptT e m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO++-- | @since 0.1.0.0+instance (Monoid w, MonadEventlog m) => MonadEventlog (Lazy.RWST r w s m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO++-- | @since 0.1.0.0+instance (Monoid w, MonadEventlog m) => MonadEventlog (Strict.RWST r w s m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO++-- | @since 0.1.0.0+instance MonadEventlog m => MonadEventlog (Lazy.StateT s m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO++-- | @since 0.1.0.0+instance MonadEventlog m => MonadEventlog (Strict.StateT s m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO++-- | @since 0.1.0.0+instance (Monoid w, MonadEventlog m) => MonadEventlog (Lazy.WriterT w m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO++-- | @since 0.1.0.0+instance (Monoid w, MonadEventlog m) => MonadEventlog (Strict.WriterT w m) where+ traceEventIO = lift . traceEventIO+ traceMarkerIO = lift . traceMarkerIO+
+ mtl/Control/Monad/Class/MonadST/Trans.hs view
@@ -0,0 +1,48 @@+{-# OPTIONS_GHC -Wno-orphans #-}+{-# OPTIONS_GHC -Wno-deprecations #-}+module Control.Monad.Class.MonadST.Trans () where++import Control.Monad.Cont (ContT)+import Control.Monad.Except (ExceptT)+import Control.Monad.RWS.Lazy qualified as Lazy+import Control.Monad.RWS.Strict qualified as Strict+import Control.Monad.State.Lazy qualified as Lazy+import Control.Monad.State.Strict qualified as Strict+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy qualified as Lazy+import Control.Monad.Writer.Strict qualified as Strict++import Control.Monad.Class.MonadST+++instance MonadST m => MonadST (ContT r m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)++instance MonadST m => MonadST (ExceptT e m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)++instance (Monoid w, MonadST m) => MonadST (Lazy.RWST r w s m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)++instance (Monoid w, MonadST m) => MonadST (Strict.RWST r w s m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)++instance MonadST m => MonadST (Lazy.StateT s m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)++instance MonadST m => MonadST (Strict.StateT s m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)++instance (Monoid w, MonadST m) => MonadST (Lazy.WriterT w m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)++instance (Monoid w, MonadST m) => MonadST (Strict.WriterT w m) where+ stToIO = lift . stToIO+ withLiftST f = withLiftST $ \g -> f (lift . g)
+ mtl/Control/Monad/Class/MonadSTM/Trans.hs view
@@ -0,0 +1,711 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}++-- undecidable instances needed for 'ContTSTM' instances of+-- 'MonadThrow' and 'MonadCatch' type classes.+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Control.Monad.Class.MonadSTM.Trans (ContTSTM (..)) where++import Control.Monad.Cont (ContT (..))+import Control.Monad.Except (ExceptT (..), runExceptT)+import Control.Monad.RWS.Lazy qualified as Lazy+import Control.Monad.RWS.Strict qualified as Strict+import Control.Monad.State.Lazy qualified as Lazy+import Control.Monad.State.Strict qualified as Strict+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy qualified as Lazy+import Control.Monad.Writer.Strict qualified as Strict++import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadThrow qualified as MonadThrow++import Data.Array.Base (MArray (..))+import Data.Function (on)+import Data.Kind (Type)+++-- | A newtype wrapper for an 'STM' monad for 'ContT'+--+newtype ContTSTM r (m :: Type -> Type) a = ContTSTM { getContTSTM :: STM m a }++deriving instance MonadSTM m => Functor (ContTSTM r m)+deriving instance MonadSTM m => Applicative (ContTSTM r m)+deriving instance MonadSTM m => Monad (ContTSTM r m)++instance ( Semigroup a, MonadSTM m ) => Semigroup (ContTSTM r m a) where+ a <> b = (<>) <$> a <*> b+instance ( Monoid a, MonadSTM m ) => Monoid (ContTSTM r m a) where+ mempty = pure mempty++instance ( MonadSTM m, MArray e a (STM m) ) => MArray e a (ContTSTM r m) where+ getBounds = ContTSTM . getBounds+ getNumElements = ContTSTM . getNumElements+ unsafeRead arr = ContTSTM . unsafeRead arr+ unsafeWrite arr i = ContTSTM . unsafeWrite arr i+#if __GLASGOW_HASKELL__ >= 910+ newArray idxs = ContTSTM . newArray idxs+#endif+++-- note: this (and the following) instance requires 'UndecidableInstances'+-- extension because it violates 3rd Paterson condition, however `STM m` will+-- resolve to a concrete type of kind (Type -> Type), and thus no larger than+-- `m` itself, e.g. for `m ~ ReaderT r f`, `STM m ~ WrappedSTM Reader r f`.+-- Instance resolution will terminate as soon as the monad transformer stack+-- depth is exhausted.+instance ( MonadSTM m+ , MonadThrow.MonadThrow (STM m)+ , MonadThrow.MonadCatch (STM m)+ ) => MonadThrow.MonadThrow (ContTSTM r m) where+ throwIO = ContTSTM . MonadThrow.throwIO+#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (ContTSTM stm) = ContTSTM (MonadThrow.annotateIO ann stm)+#endif++instance ( MonadSTM m+ , MonadThrow.MonadThrow (STM m)+ , MonadThrow.MonadCatch (STM m)+ ) => MonadThrow.MonadCatch (ContTSTM r m) where+ catch action handler = ContTSTM+ $ MonadThrow.catch (getContTSTM action) (getContTSTM . handler)+ generalBracket acquire release use = ContTSTM $+ MonadThrow.generalBracket (getContTSTM acquire)+ (getContTSTM .: release)+ (getContTSTM . use)++-- | @'ContT' r m@ monad is using underlying @'STM' m@ monad as its stm monad,+-- without transforming it.+--+instance MonadSTM m => MonadSTM (ContT r m) where+ type STM (ContT r m) = ContTSTM r m+ atomically = lift . atomically . getContTSTM++ type TVar (ContT r m) = TVar m+ newTVar = ContTSTM . newTVar+ readTVar = ContTSTM . readTVar+ writeTVar = ContTSTM .: writeTVar+ retry = ContTSTM retry+ orElse = ContTSTM .: on orElse getContTSTM++ modifyTVar = ContTSTM .: modifyTVar+ modifyTVar' = ContTSTM .: modifyTVar'+ stateTVar = ContTSTM .: stateTVar+ swapTVar = ContTSTM .: swapTVar+ check = ContTSTM . check++ type TMVar (ContT r m) = TMVar m+ newTMVar = ContTSTM . newTMVar+ newEmptyTMVar = ContTSTM newEmptyTMVar+ takeTMVar = ContTSTM . takeTMVar+ tryTakeTMVar = ContTSTM . tryTakeTMVar+ putTMVar = ContTSTM .: putTMVar+ tryPutTMVar = ContTSTM .: tryPutTMVar+ readTMVar = ContTSTM . readTMVar+ tryReadTMVar = ContTSTM . tryReadTMVar+ swapTMVar = ContTSTM .: swapTMVar+ writeTMVar = ContTSTM .: writeTMVar+ isEmptyTMVar = ContTSTM . isEmptyTMVar++ type TQueue (ContT r m) = TQueue m+ newTQueue = ContTSTM newTQueue+ readTQueue = ContTSTM . readTQueue+ tryReadTQueue = ContTSTM . tryReadTQueue+ peekTQueue = ContTSTM . peekTQueue+ tryPeekTQueue = ContTSTM . tryPeekTQueue+ flushTQueue = ContTSTM . flushTQueue+ writeTQueue v = ContTSTM . writeTQueue v+ isEmptyTQueue = ContTSTM . isEmptyTQueue+ unGetTQueue = ContTSTM .: unGetTQueue++ type TBQueue (ContT r m) = TBQueue m+ newTBQueue = ContTSTM . newTBQueue+ readTBQueue = ContTSTM . readTBQueue+ tryReadTBQueue = ContTSTM . tryReadTBQueue+ peekTBQueue = ContTSTM . peekTBQueue+ tryPeekTBQueue = ContTSTM . tryPeekTBQueue+ flushTBQueue = ContTSTM . flushTBQueue+ writeTBQueue = ContTSTM .: writeTBQueue+ lengthTBQueue = ContTSTM . lengthTBQueue+ isEmptyTBQueue = ContTSTM . isEmptyTBQueue+ isFullTBQueue = ContTSTM . isFullTBQueue+ unGetTBQueue = ContTSTM .: unGetTBQueue++ type TArray (ContT r m) = TArray m++ type TSem (ContT r m) = TSem m+ newTSem = ContTSTM . newTSem+ waitTSem = ContTSTM . waitTSem+ signalTSem = ContTSTM . signalTSem+ signalTSemN = ContTSTM .: signalTSemN++ type TChan (ContT r m) = TChan m+ newTChan = ContTSTM newTChan+ newBroadcastTChan = ContTSTM newBroadcastTChan+ dupTChan = ContTSTM . dupTChan+ cloneTChan = ContTSTM . cloneTChan+ readTChan = ContTSTM . readTChan+ tryReadTChan = ContTSTM . tryReadTChan+ peekTChan = ContTSTM . peekTChan+ tryPeekTChan = ContTSTM . tryPeekTChan+ writeTChan = ContTSTM .: writeTChan+ unGetTChan = ContTSTM .: unGetTChan+ isEmptyTChan = ContTSTM . isEmptyTChan+++-- | The underlying stm monad is also transformed.+--+instance (Monoid w, MonadSTM m) => MonadSTM (Lazy.WriterT w m) where+ type STM (Lazy.WriterT w m) = Lazy.WriterT w (STM m)+ atomically (Lazy.WriterT stm) = Lazy.WriterT (atomically stm)++ type TVar (Lazy.WriterT w m) = TVar m+ newTVar = lift . newTVar+ readTVar = lift . readTVar+ writeTVar = lift .: writeTVar+ retry = lift retry+ orElse (Lazy.WriterT a) (Lazy.WriterT b) = Lazy.WriterT $ a `orElse` b++ modifyTVar = lift .: modifyTVar+ modifyTVar' = lift .: modifyTVar'+ stateTVar = lift .: stateTVar+ swapTVar = lift .: swapTVar+ check = lift . check++ type TMVar (Lazy.WriterT w m) = TMVar m+ newTMVar = lift . newTMVar+ newEmptyTMVar = lift newEmptyTMVar+ takeTMVar = lift . takeTMVar+ tryTakeTMVar = lift . tryTakeTMVar+ putTMVar = lift .: putTMVar+ tryPutTMVar = lift .: tryPutTMVar+ readTMVar = lift . readTMVar+ tryReadTMVar = lift . tryReadTMVar+ swapTMVar = lift .: swapTMVar+ writeTMVar = lift .: writeTMVar+ isEmptyTMVar = lift . isEmptyTMVar++ type TQueue (Lazy.WriterT w m) = TQueue m+ newTQueue = lift newTQueue+ readTQueue = lift . readTQueue+ tryReadTQueue = lift . tryReadTQueue+ peekTQueue = lift . peekTQueue+ tryPeekTQueue = lift . tryPeekTQueue+ flushTQueue = lift . flushTQueue+ writeTQueue v = lift . writeTQueue v+ isEmptyTQueue = lift . isEmptyTQueue+ unGetTQueue = lift .: unGetTQueue++ type TBQueue (Lazy.WriterT w m) = TBQueue m+ newTBQueue = lift . newTBQueue+ readTBQueue = lift . readTBQueue+ tryReadTBQueue = lift . tryReadTBQueue+ peekTBQueue = lift . peekTBQueue+ tryPeekTBQueue = lift . tryPeekTBQueue+ flushTBQueue = lift . flushTBQueue+ writeTBQueue = lift .: writeTBQueue+ lengthTBQueue = lift . lengthTBQueue+ isEmptyTBQueue = lift . isEmptyTBQueue+ isFullTBQueue = lift . isFullTBQueue+ unGetTBQueue = lift .: unGetTBQueue++ type TArray (Lazy.WriterT w m) = TArray m++ type TSem (Lazy.WriterT w m) = TSem m+ newTSem = lift . newTSem+ waitTSem = lift . waitTSem+ signalTSem = lift . signalTSem+ signalTSemN = lift .: signalTSemN++ type TChan (Lazy.WriterT w m) = TChan m+ newTChan = lift newTChan+ newBroadcastTChan = lift newBroadcastTChan+ dupTChan = lift . dupTChan+ cloneTChan = lift . cloneTChan+ readTChan = lift . readTChan+ tryReadTChan = lift . tryReadTChan+ peekTChan = lift . peekTChan+ tryPeekTChan = lift . tryPeekTChan+ writeTChan = lift .: writeTChan+ unGetTChan = lift .: unGetTChan+ isEmptyTChan = lift . isEmptyTChan+++-- | The underlying stm monad is also transformed.+--+instance (Monoid w, MonadSTM m) => MonadSTM (Strict.WriterT w m) where+ type STM (Strict.WriterT w m) = Strict.WriterT w (STM m)+ atomically (Strict.WriterT stm) = Strict.WriterT (atomically stm)++ type TVar (Strict.WriterT w m) = TVar m+ newTVar = lift . newTVar+ readTVar = lift . readTVar+ writeTVar = lift .: writeTVar+ retry = lift retry+ orElse (Strict.WriterT a) (Strict.WriterT b) = Strict.WriterT $ a `orElse` b++ modifyTVar = lift .: modifyTVar+ modifyTVar' = lift .: modifyTVar'+ stateTVar = lift .: stateTVar+ swapTVar = lift .: swapTVar+ check = lift . check++ type TMVar (Strict.WriterT w m) = TMVar m+ newTMVar = lift . newTMVar+ newEmptyTMVar = lift newEmptyTMVar+ takeTMVar = lift . takeTMVar+ tryTakeTMVar = lift . tryTakeTMVar+ putTMVar = lift .: putTMVar+ tryPutTMVar = lift .: tryPutTMVar+ readTMVar = lift . readTMVar+ tryReadTMVar = lift . tryReadTMVar+ swapTMVar = lift .: swapTMVar+ writeTMVar = lift .: writeTMVar+ isEmptyTMVar = lift . isEmptyTMVar++ type TQueue (Strict.WriterT w m) = TQueue m+ newTQueue = lift newTQueue+ readTQueue = lift . readTQueue+ tryReadTQueue = lift . tryReadTQueue+ peekTQueue = lift . peekTQueue+ tryPeekTQueue = lift . tryPeekTQueue+ flushTQueue = lift . flushTQueue+ writeTQueue v = lift . writeTQueue v+ isEmptyTQueue = lift . isEmptyTQueue+ unGetTQueue = lift .: unGetTQueue++ type TBQueue (Strict.WriterT w m) = TBQueue m+ newTBQueue = lift . newTBQueue+ readTBQueue = lift . readTBQueue+ tryReadTBQueue = lift . tryReadTBQueue+ peekTBQueue = lift . peekTBQueue+ tryPeekTBQueue = lift . tryPeekTBQueue+ flushTBQueue = lift . flushTBQueue+ writeTBQueue = lift .: writeTBQueue+ lengthTBQueue = lift . lengthTBQueue+ isEmptyTBQueue = lift . isEmptyTBQueue+ isFullTBQueue = lift . isFullTBQueue+ unGetTBQueue = lift .: unGetTBQueue++ type TArray (Strict.WriterT w m) = TArray m++ type TSem (Strict.WriterT w m) = TSem m+ newTSem = lift . newTSem+ waitTSem = lift . waitTSem+ signalTSem = lift . signalTSem+ signalTSemN = lift .: signalTSemN++ type TChan (Strict.WriterT w m) = TChan m+ newTChan = lift newTChan+ newBroadcastTChan = lift newBroadcastTChan+ dupTChan = lift . dupTChan+ cloneTChan = lift . cloneTChan+ readTChan = lift . readTChan+ tryReadTChan = lift . tryReadTChan+ peekTChan = lift . peekTChan+ tryPeekTChan = lift . tryPeekTChan+ writeTChan = lift .: writeTChan+ unGetTChan = lift .: unGetTChan+ isEmptyTChan = lift . isEmptyTChan+++-- | The underlying stm monad is also transformed.+--+instance MonadSTM m => MonadSTM (Lazy.StateT s m) where+ type STM (Lazy.StateT s m) = Lazy.StateT s (STM m)+ atomically (Lazy.StateT stm) = Lazy.StateT $ \s -> atomically (stm s)++ type TVar (Lazy.StateT s m) = TVar m+ newTVar = lift . newTVar+ readTVar = lift . readTVar+ writeTVar = lift .: writeTVar+ retry = lift retry+ orElse (Lazy.StateT a) (Lazy.StateT b) = Lazy.StateT $ \s -> a s `orElse` b s++ modifyTVar = lift .: modifyTVar+ modifyTVar' = lift .: modifyTVar'+ stateTVar = lift .: stateTVar+ swapTVar = lift .: swapTVar+ check = lift . check++ type TMVar (Lazy.StateT s m) = TMVar m+ newTMVar = lift . newTMVar+ newEmptyTMVar = lift newEmptyTMVar+ takeTMVar = lift . takeTMVar+ tryTakeTMVar = lift . tryTakeTMVar+ putTMVar = lift .: putTMVar+ tryPutTMVar = lift .: tryPutTMVar+ readTMVar = lift . readTMVar+ tryReadTMVar = lift . tryReadTMVar+ swapTMVar = lift .: swapTMVar+ writeTMVar = lift .: writeTMVar+ isEmptyTMVar = lift . isEmptyTMVar++ type TQueue (Lazy.StateT s m) = TQueue m+ newTQueue = lift newTQueue+ readTQueue = lift . readTQueue+ tryReadTQueue = lift . tryReadTQueue+ peekTQueue = lift . peekTQueue+ tryPeekTQueue = lift . tryPeekTQueue+ flushTQueue = lift . flushTQueue+ writeTQueue v = lift . writeTQueue v+ isEmptyTQueue = lift . isEmptyTQueue+ unGetTQueue = lift .: unGetTQueue++ type TBQueue (Lazy.StateT s m) = TBQueue m+ newTBQueue = lift . newTBQueue+ readTBQueue = lift . readTBQueue+ tryReadTBQueue = lift . tryReadTBQueue+ peekTBQueue = lift . peekTBQueue+ tryPeekTBQueue = lift . tryPeekTBQueue+ flushTBQueue = lift . flushTBQueue+ writeTBQueue = lift .: writeTBQueue+ lengthTBQueue = lift . lengthTBQueue+ isEmptyTBQueue = lift . isEmptyTBQueue+ isFullTBQueue = lift . isFullTBQueue+ unGetTBQueue = lift .: unGetTBQueue++ type TArray (Lazy.StateT s m) = TArray m++ type TSem (Lazy.StateT s m) = TSem m+ newTSem = lift . newTSem+ waitTSem = lift . waitTSem+ signalTSem = lift . signalTSem+ signalTSemN = lift .: signalTSemN++ type TChan (Lazy.StateT s m) = TChan m+ newTChan = lift newTChan+ newBroadcastTChan = lift newBroadcastTChan+ dupTChan = lift . dupTChan+ cloneTChan = lift . cloneTChan+ readTChan = lift . readTChan+ tryReadTChan = lift . tryReadTChan+ peekTChan = lift . peekTChan+ tryPeekTChan = lift . tryPeekTChan+ writeTChan = lift .: writeTChan+ unGetTChan = lift .: unGetTChan+ isEmptyTChan = lift . isEmptyTChan+++-- | The underlying stm monad is also transformed.+--+instance MonadSTM m => MonadSTM (Strict.StateT s m) where+ type STM (Strict.StateT s m) = Strict.StateT s (STM m)+ atomically (Strict.StateT stm) = Strict.StateT $ \s -> atomically (stm s)++ type TVar (Strict.StateT s m) = TVar m+ newTVar = lift . newTVar+ readTVar = lift . readTVar+ writeTVar = lift .: writeTVar+ retry = lift retry+ orElse (Strict.StateT a) (Strict.StateT b) = Strict.StateT $ \s -> a s `orElse` b s++ modifyTVar = lift .: modifyTVar+ modifyTVar' = lift .: modifyTVar'+ stateTVar = lift .: stateTVar+ swapTVar = lift .: swapTVar+ check = lift . check++ type TMVar (Strict.StateT s m) = TMVar m+ newTMVar = lift . newTMVar+ newEmptyTMVar = lift newEmptyTMVar+ takeTMVar = lift . takeTMVar+ tryTakeTMVar = lift . tryTakeTMVar+ putTMVar = lift .: putTMVar+ tryPutTMVar = lift .: tryPutTMVar+ readTMVar = lift . readTMVar+ tryReadTMVar = lift . tryReadTMVar+ swapTMVar = lift .: swapTMVar+ writeTMVar = lift .: writeTMVar+ isEmptyTMVar = lift . isEmptyTMVar++ type TQueue (Strict.StateT s m) = TQueue m+ newTQueue = lift newTQueue+ readTQueue = lift . readTQueue+ tryReadTQueue = lift . tryReadTQueue+ peekTQueue = lift . peekTQueue+ tryPeekTQueue = lift . tryPeekTQueue+ flushTQueue = lift . flushTQueue+ writeTQueue v = lift . writeTQueue v+ isEmptyTQueue = lift . isEmptyTQueue+ unGetTQueue = lift .: unGetTQueue++ type TBQueue (Strict.StateT s m) = TBQueue m+ newTBQueue = lift . newTBQueue+ readTBQueue = lift . readTBQueue+ tryReadTBQueue = lift . tryReadTBQueue+ peekTBQueue = lift . peekTBQueue+ tryPeekTBQueue = lift . tryPeekTBQueue+ flushTBQueue = lift . flushTBQueue+ writeTBQueue = lift .: writeTBQueue+ lengthTBQueue = lift . lengthTBQueue+ isEmptyTBQueue = lift . isEmptyTBQueue+ isFullTBQueue = lift . isFullTBQueue+ unGetTBQueue = lift .: unGetTBQueue++ type TArray (Strict.StateT s m) = TArray m++ type TSem (Strict.StateT s m) = TSem m+ newTSem = lift . newTSem+ waitTSem = lift . waitTSem+ signalTSem = lift . signalTSem+ signalTSemN = lift .: signalTSemN++ type TChan (Strict.StateT s m) = TChan m+ newTChan = lift newTChan+ newBroadcastTChan = lift newBroadcastTChan+ dupTChan = lift . dupTChan+ cloneTChan = lift . cloneTChan+ readTChan = lift . readTChan+ tryReadTChan = lift . tryReadTChan+ peekTChan = lift . peekTChan+ tryPeekTChan = lift . tryPeekTChan+ writeTChan = lift .: writeTChan+ unGetTChan = lift .: unGetTChan+ isEmptyTChan = lift . isEmptyTChan+++-- | The underlying stm monad is also transformed.+--+instance MonadSTM m => MonadSTM (ExceptT e m) where+ type STM (ExceptT e m) = ExceptT e (STM m)+ atomically = ExceptT . atomically . runExceptT++ type TVar (ExceptT e m) = TVar m+ newTVar = lift . newTVar+ readTVar = lift . readTVar+ writeTVar = lift .: writeTVar+ retry = lift retry+ orElse = ExceptT .: on orElse runExceptT++ modifyTVar = lift .: modifyTVar+ modifyTVar' = lift .: modifyTVar'+ stateTVar = lift .: stateTVar+ swapTVar = lift .: swapTVar+ check = lift . check++ type TMVar (ExceptT e m) = TMVar m+ newTMVar = lift . newTMVar+ newEmptyTMVar = lift newEmptyTMVar+ takeTMVar = lift . takeTMVar+ tryTakeTMVar = lift . tryTakeTMVar+ putTMVar = lift .: putTMVar+ tryPutTMVar = lift .: tryPutTMVar+ readTMVar = lift . readTMVar+ tryReadTMVar = lift . tryReadTMVar+ swapTMVar = lift .: swapTMVar+ writeTMVar = lift .: writeTMVar+ isEmptyTMVar = lift . isEmptyTMVar++ type TQueue (ExceptT e m) = TQueue m+ newTQueue = lift newTQueue+ readTQueue = lift . readTQueue+ tryReadTQueue = lift . tryReadTQueue+ peekTQueue = lift . peekTQueue+ tryPeekTQueue = lift . tryPeekTQueue+ flushTQueue = lift . flushTQueue+ writeTQueue v = lift . writeTQueue v+ isEmptyTQueue = lift . isEmptyTQueue+ unGetTQueue = lift .: unGetTQueue++ type TBQueue (ExceptT e m) = TBQueue m+ newTBQueue = lift . newTBQueue+ readTBQueue = lift . readTBQueue+ tryReadTBQueue = lift . tryReadTBQueue+ peekTBQueue = lift . peekTBQueue+ tryPeekTBQueue = lift . tryPeekTBQueue+ flushTBQueue = lift . flushTBQueue+ writeTBQueue = lift .: writeTBQueue+ lengthTBQueue = lift . lengthTBQueue+ isEmptyTBQueue = lift . isEmptyTBQueue+ isFullTBQueue = lift . isFullTBQueue+ unGetTBQueue = lift .: unGetTBQueue++ type TArray (ExceptT e m) = TArray m++ type TSem (ExceptT e m) = TSem m+ newTSem = lift . newTSem+ waitTSem = lift . waitTSem+ signalTSem = lift . signalTSem+ signalTSemN = lift .: signalTSemN++ type TChan (ExceptT e m) = TChan m+ newTChan = lift newTChan+ newBroadcastTChan = lift newBroadcastTChan+ dupTChan = lift . dupTChan+ cloneTChan = lift . cloneTChan+ readTChan = lift . readTChan+ tryReadTChan = lift . tryReadTChan+ peekTChan = lift . peekTChan+ tryPeekTChan = lift . tryPeekTChan+ writeTChan = lift .: writeTChan+ unGetTChan = lift .: unGetTChan+ isEmptyTChan = lift . isEmptyTChan+++-- | The underlying stm monad is also transformed.+--+instance (Monoid w, MonadSTM m) => MonadSTM (Lazy.RWST r w s m) where+ type STM (Lazy.RWST r w s m) = Lazy.RWST r w s (STM m)+ atomically (Lazy.RWST stm) = Lazy.RWST $ \r s -> atomically (stm r s)++ type TVar (Lazy.RWST r w s m) = TVar m+ newTVar = lift . newTVar+ readTVar = lift . readTVar+ writeTVar = lift .: writeTVar+ retry = lift retry+ orElse (Lazy.RWST a) (Lazy.RWST b) = Lazy.RWST $ \r s -> a r s `orElse` b r s++ modifyTVar = lift .: modifyTVar+ modifyTVar' = lift .: modifyTVar'+ stateTVar = lift .: stateTVar+ swapTVar = lift .: swapTVar+ check = lift . check++ type TMVar (Lazy.RWST r w s m) = TMVar m+ newTMVar = lift . newTMVar+ newEmptyTMVar = lift newEmptyTMVar+ takeTMVar = lift . takeTMVar+ tryTakeTMVar = lift . tryTakeTMVar+ putTMVar = lift .: putTMVar+ tryPutTMVar = lift .: tryPutTMVar+ readTMVar = lift . readTMVar+ tryReadTMVar = lift . tryReadTMVar+ swapTMVar = lift .: swapTMVar+ writeTMVar = lift .: writeTMVar+ isEmptyTMVar = lift . isEmptyTMVar++ type TQueue (Lazy.RWST r w s m) = TQueue m+ newTQueue = lift newTQueue+ readTQueue = lift . readTQueue+ tryReadTQueue = lift . tryReadTQueue+ peekTQueue = lift . peekTQueue+ tryPeekTQueue = lift . tryPeekTQueue+ flushTQueue = lift . flushTQueue+ writeTQueue v = lift . writeTQueue v+ isEmptyTQueue = lift . isEmptyTQueue+ unGetTQueue = lift .: unGetTQueue++ type TBQueue (Lazy.RWST r w s m) = TBQueue m+ newTBQueue = lift . newTBQueue+ readTBQueue = lift . readTBQueue+ tryReadTBQueue = lift . tryReadTBQueue+ peekTBQueue = lift . peekTBQueue+ tryPeekTBQueue = lift . tryPeekTBQueue+ flushTBQueue = lift . flushTBQueue+ writeTBQueue = lift .: writeTBQueue+ lengthTBQueue = lift . lengthTBQueue+ isEmptyTBQueue = lift . isEmptyTBQueue+ isFullTBQueue = lift . isFullTBQueue+ unGetTBQueue = lift .: unGetTBQueue++ type TArray (Lazy.RWST r w s m) = TArray m++ type TSem (Lazy.RWST r w s m) = TSem m+ newTSem = lift . newTSem+ waitTSem = lift . waitTSem+ signalTSem = lift . signalTSem+ signalTSemN = lift .: signalTSemN++ type TChan (Lazy.RWST r w s m) = TChan m+ newTChan = lift newTChan+ newBroadcastTChan = lift newBroadcastTChan+ dupTChan = lift . dupTChan+ cloneTChan = lift . cloneTChan+ readTChan = lift . readTChan+ tryReadTChan = lift . tryReadTChan+ peekTChan = lift . peekTChan+ tryPeekTChan = lift . tryPeekTChan+ writeTChan = lift .: writeTChan+ unGetTChan = lift .: unGetTChan+ isEmptyTChan = lift . isEmptyTChan+++-- | The underlying stm monad is also transformed.+--+instance (Monoid w, MonadSTM m) => MonadSTM (Strict.RWST r w s m) where+ type STM (Strict.RWST r w s m) = Strict.RWST r w s (STM m)+ atomically (Strict.RWST stm) = Strict.RWST $ \r s -> atomically (stm r s)++ type TVar (Strict.RWST r w s m) = TVar m+ newTVar = lift . newTVar+ readTVar = lift . readTVar+ writeTVar = lift .: writeTVar+ retry = lift retry+ orElse (Strict.RWST a) (Strict.RWST b) = Strict.RWST $ \r s -> a r s `orElse` b r s++ modifyTVar = lift .: modifyTVar+ modifyTVar' = lift .: modifyTVar'+ stateTVar = lift .: stateTVar+ swapTVar = lift .: swapTVar+ check = lift . check++ type TMVar (Strict.RWST r w s m) = TMVar m+ newTMVar = lift . newTMVar+ newEmptyTMVar = lift newEmptyTMVar+ takeTMVar = lift . takeTMVar+ tryTakeTMVar = lift . tryTakeTMVar+ putTMVar = lift .: putTMVar+ tryPutTMVar = lift .: tryPutTMVar+ readTMVar = lift . readTMVar+ tryReadTMVar = lift . tryReadTMVar+ swapTMVar = lift .: swapTMVar+ writeTMVar = lift .: writeTMVar+ isEmptyTMVar = lift . isEmptyTMVar++ type TQueue (Strict.RWST r w s m) = TQueue m+ newTQueue = lift newTQueue+ readTQueue = lift . readTQueue+ tryReadTQueue = lift . tryReadTQueue+ peekTQueue = lift . peekTQueue+ tryPeekTQueue = lift . tryPeekTQueue+ flushTQueue = lift . flushTQueue+ writeTQueue v = lift . writeTQueue v+ isEmptyTQueue = lift . isEmptyTQueue+ unGetTQueue = lift .: unGetTQueue++ type TBQueue (Strict.RWST r w s m) = TBQueue m+ newTBQueue = lift . newTBQueue+ readTBQueue = lift . readTBQueue+ tryReadTBQueue = lift . tryReadTBQueue+ peekTBQueue = lift . peekTBQueue+ tryPeekTBQueue = lift . tryPeekTBQueue+ flushTBQueue = lift . flushTBQueue+ writeTBQueue = lift .: writeTBQueue+ lengthTBQueue = lift . lengthTBQueue+ isEmptyTBQueue = lift . isEmptyTBQueue+ isFullTBQueue = lift . isFullTBQueue+ unGetTBQueue = lift .: unGetTBQueue++ type TArray (Strict.RWST r w s m) = TArray m++ type TSem (Strict.RWST r w s m) = TSem m+ newTSem = lift . newTSem+ waitTSem = lift . waitTSem+ signalTSem = lift . signalTSem+ signalTSemN = lift .: signalTSemN++ type TChan (Strict.RWST r w s m) = TChan m+ newTChan = lift newTChan+ newBroadcastTChan = lift newBroadcastTChan+ dupTChan = lift . dupTChan+ cloneTChan = lift . cloneTChan+ readTChan = lift . readTChan+ tryReadTChan = lift . tryReadTChan+ peekTChan = lift . peekTChan+ tryPeekTChan = lift . tryPeekTChan+ writeTChan = lift .: writeTChan+ unGetTChan = lift .: unGetTChan+ isEmptyTChan = lift . isEmptyTChan+++(.:) :: (c -> d) -> (a -> b -> c) -> (a -> b -> d)+(f .: g) x y = f (g x y)
+ mtl/Control/Monad/Class/MonadSay/Trans.hs view
@@ -0,0 +1,30 @@+{-# OPTIONS_GHC -Wno-orphans #-}+module Control.Monad.Class.MonadSay.Trans () where++import Control.Monad.Cont+import Control.Monad.Except+import Control.Monad.RWS+import Control.Monad.State+import Control.Monad.Writer++import Control.Monad.Class.MonadSay++-- | @since 0.1.0.0+instance MonadSay m => MonadSay (ContT r m) where+ say = lift . say++-- | @since 0.1.0.0+instance MonadSay m => MonadSay (ExceptT e m) where+ say = lift . say++-- | @since 0.1.0.0+instance (Monoid w, MonadSay m) => MonadSay (RWST r w s m) where+ say = lift . say++-- | @since 0.1.0.0+instance MonadSay m => MonadSay (StateT s m) where+ say = lift . say++-- | @since 0.1.0.0+instance (Monoid w, MonadSay m) => MonadSay (WriterT w m) where+ say = lift . say
+ mtl/Control/Monad/Class/MonadThrow/Trans.hs view
@@ -0,0 +1,329 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE RankNTypes #-}+{-# OPTIONS_GHC -Wno-orphans #-}+module Control.Monad.Class.MonadThrow.Trans () where++import Control.Monad.Except (ExceptT (..), runExceptT)+import Control.Monad.RWS.Lazy qualified as Lazy+import Control.Monad.RWS.Strict qualified as Strict+import Control.Monad.State.Lazy qualified as Lazy+import Control.Monad.State.Strict qualified as Strict+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy qualified as Lazy+import Control.Monad.Writer.Strict qualified as Strict++import Control.Monad.Class.MonadThrow++--+-- ExceptT Instances+--+-- These all follow the @exceptions@ package to the letter+--++instance MonadCatch m => MonadThrow (ExceptT e m) where+ throwIO = lift . throwIO+#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (ExceptT io) = ExceptT (annotateIO ann io)+#endif+++instance MonadCatch m => MonadCatch (ExceptT e m) where+ catch (ExceptT m) f = ExceptT $ catch m (runExceptT . f)++ generalBracket acquire release use = ExceptT $ do+ (eb, ec) <- generalBracket+ (runExceptT acquire)+ (\eresource exitCase -> case eresource of+ Left e -> return (Left e) -- nothing to release, acquire didn't succeed+ Right resource -> case exitCase of+ ExitCaseSuccess (Right b) -> runExceptT (release resource (ExitCaseSuccess b))+ ExitCaseException e -> runExceptT (release resource (ExitCaseException e))+ _ -> runExceptT (release resource ExitCaseAbort))+ (either (return . Left) (runExceptT . use))+ return $ do+ -- The order in which we perform those two 'Either' effects determines+ -- which error will win if they are both 'Left's. We want the error from+ -- 'release' to win.+ c <- ec+ b <- eb+ return (b, c)++instance MonadMask m => MonadMask (ExceptT e m) where+ mask f = ExceptT $ mask $ \u -> runExceptT $ f (q u)+ where+ q :: (m (Either e a) -> m (Either e a))+ -> ExceptT e m a -> ExceptT e m a+ q u (ExceptT b) = ExceptT (u b)+ uninterruptibleMask f = ExceptT $ uninterruptibleMask $ \u -> runExceptT $ f (q u)+ where+ q :: (m (Either e a) -> m (Either e a))+ -> ExceptT e m a -> ExceptT e m a+ q u (ExceptT b) = ExceptT (u b)++--+-- Lazy.WriterT instances+--++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadThrow (Lazy.WriterT w m) where+ throwIO = lift . throwIO++#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (Lazy.WriterT io) = Lazy.WriterT (annotateIO ann io)+#endif++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadCatch (Lazy.WriterT w m) where+ catch (Lazy.WriterT m) f = Lazy.WriterT $ catch m (Lazy.runWriterT . f)++ generalBracket acquire release use = Lazy.WriterT $ fmap f $+ generalBracket+ (Lazy.runWriterT acquire)+ (\(resource, w) e ->+ case e of+ ExitCaseSuccess (b, w') ->+ g w' <$> Lazy.runWriterT (release resource (ExitCaseSuccess b))+ ExitCaseException err ->+ g w <$> Lazy.runWriterT (release resource (ExitCaseException err))+ ExitCaseAbort ->+ g w <$> Lazy.runWriterT (release resource ExitCaseAbort))+ (\(resource, w) -> g w <$> Lazy.runWriterT (use resource))+ where f ((x,_),(y,w)) = ((x,y),w)+ g w (a,w') = (a,w<>w')++-- | @since 1.0.0.0+instance (Monoid w, MonadMask m) => MonadMask (Lazy.WriterT w m) where+ mask f = Lazy.WriterT $ mask $ \u -> Lazy.runWriterT $ f (q u)+ where+ q :: (forall x. m x -> m x)+ -> Lazy.WriterT w m a -> Lazy.WriterT w m a+ q u (Lazy.WriterT b) = Lazy.WriterT (u b)+ uninterruptibleMask f = Lazy.WriterT $ uninterruptibleMask $ \u -> Lazy.runWriterT $ f (q u)+ where+ q :: (forall x. m x -> m x)+ -> Lazy.WriterT w m a -> Lazy.WriterT w m a+ q u (Lazy.WriterT b) = Lazy.WriterT (u b)++--+-- Strict.WriterT instances+--++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadThrow (Strict.WriterT w m) where+ throwIO = lift . throwIO+#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (Strict.WriterT io) = Strict.WriterT (annotateIO ann io)+#endif++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadCatch (Strict.WriterT w m) where+ catch (Strict.WriterT m) f = Strict.WriterT $ catch m (Strict.runWriterT . f)++ generalBracket acquire release use = Strict.WriterT $ fmap f $+ generalBracket+ (Strict.runWriterT acquire)+ (\(resource, w) e ->+ case e of+ ExitCaseSuccess (b, w') ->+ g w' <$> Strict.runWriterT (release resource (ExitCaseSuccess b))+ ExitCaseException err ->+ g w <$> Strict.runWriterT (release resource (ExitCaseException err))+ ExitCaseAbort ->+ g w <$> Strict.runWriterT (release resource ExitCaseAbort))+ (\(resource, w) -> g w <$> Strict.runWriterT (use resource))+ where f ((x,_),(y,w)) = ((x,y),w)+ g w (a,w') = (a,w<>w')++-- | @since 1.0.0.0+instance (Monoid w, MonadMask m) => MonadMask (Strict.WriterT w m) where+ mask f = Strict.WriterT $ mask $ \u -> Strict.runWriterT $ f (q u)+ where+ q :: (forall x. m x -> m x)+ -> Strict.WriterT w m a -> Strict.WriterT w m a+ q u (Strict.WriterT b) = Strict.WriterT (u b)+ uninterruptibleMask f = Strict.WriterT $ uninterruptibleMask $ \u -> Strict.runWriterT $ f (q u)+ where+ q :: (forall x. m x -> m x)+ -> Strict.WriterT w m a -> Strict.WriterT w m a+ q u (Strict.WriterT b) = Strict.WriterT (u b)+++--+-- Lazy.RWST Instances+--++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadThrow (Lazy.RWST r w s m) where+ throwIO = lift . throwIO+#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (Lazy.RWST io) = Lazy.RWST (\r s -> annotateIO ann (io r s))+#endif++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadCatch (Lazy.RWST r w s m) where+ catch (Lazy.RWST m) f = Lazy.RWST $ \r s -> catch (m r s) (\e -> Lazy.runRWST (f e) r s)++ -- | general bracket ignores the state produced by the release callback+ generalBracket acquire release use = Lazy.RWST $ \r s ->+ f <$> generalBracket+ (Lazy.runRWST acquire r s)+ (\(resource, s', w') e ->+ case e of+ ExitCaseSuccess (b, s'', w'') ->+ g w'' <$> Lazy.runRWST (release resource (ExitCaseSuccess b)) r s''+ ExitCaseException err ->+ g w' <$> Lazy.runRWST (release resource (ExitCaseException err)) r s'+ ExitCaseAbort ->+ g w' <$> Lazy.runRWST (release resource ExitCaseAbort) r s')+ (\(a, s', w') -> g w' <$> Lazy.runRWST (use a) r s')+ where+ f ((x,_,_),(y,s,w)) = ((x,y),s,w)+ g w (x,s,w') = (x,s,w<>w')++-- | @since 1.0.0.0+instance (Monoid w, MonadMask m) => MonadMask (Lazy.RWST r w s m) where+ mask f = Lazy.RWST $ \r s -> mask $ \u -> Lazy.runRWST (f (q u)) r s+ where+ q :: (forall x. m x -> m x)+ -> Lazy.RWST r w s m a -> Lazy.RWST r w s m a+ q u (Lazy.RWST b) = Lazy.RWST $ \r s -> u (b r s)+ uninterruptibleMask f = Lazy.RWST $ \r s -> uninterruptibleMask $ \u -> Lazy.runRWST (f (q u)) r s+ where+ q :: (forall x. m x -> m x)+ -> Lazy.RWST r w s m a -> Lazy.RWST r w s m a+ q u (Lazy.RWST b) = Lazy.RWST $ \r s -> u (b r s)+++--+-- Strict.RWST Instances+--++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadThrow (Strict.RWST r w s m) where+ throwIO = lift . throwIO+#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (Strict.RWST io) = Strict.RWST (\r s -> annotateIO ann (io r s))+#endif++-- | @since 1.0.0.0+instance (Monoid w, MonadCatch m) => MonadCatch (Strict.RWST r w s m) where+ catch (Strict.RWST m) f = Strict.RWST $ \r s -> catch (m r s) (\e -> Strict.runRWST (f e) r s)++ -- | general bracket ignores the state produced by the release callback+ generalBracket acquire release use = Strict.RWST $ \r s ->+ f <$> generalBracket+ (Strict.runRWST acquire r s)+ (\(resource, s', w') e ->+ case e of+ ExitCaseSuccess (b, s'', w'') ->+ g w'' <$> Strict.runRWST (release resource (ExitCaseSuccess b)) r s''+ ExitCaseException err ->+ g w' <$> Strict.runRWST (release resource (ExitCaseException err)) r s'+ ExitCaseAbort ->+ g w' <$> Strict.runRWST (release resource ExitCaseAbort) r s')+ (\(a, s', w') -> g w' <$> Strict.runRWST (use a) r s')+ where+ f ((x,_,_),(y,s,w)) = ((x,y),s,w)+ g w (x,s,w') = (x,s,w<>w')++-- | @since 1.0.0.0+instance (Monoid w, MonadMask m) => MonadMask (Strict.RWST r w s m) where+ mask f = Strict.RWST $ \r s -> mask $ \u -> Strict.runRWST (f (q u)) r s+ where+ q :: (forall x. m x -> m x)+ -> Strict.RWST r w s m a -> Strict.RWST r w s m a+ q u (Strict.RWST b) = Strict.RWST $ \r s -> u (b r s)+ uninterruptibleMask f = Strict.RWST $ \r s -> uninterruptibleMask $ \u -> Strict.runRWST (f (q u)) r s+ where+ q :: (forall x. m x -> m x)+ -> Strict.RWST r w s m a -> Strict.RWST r w s m a+ q u (Strict.RWST b) = Strict.RWST $ \r s -> u (b r s)+++--+-- Lazy.StateT instances+--++-- | @since 1.0.0.0+instance MonadCatch m => MonadThrow (Lazy.StateT s m) where+ throwIO = lift . throwIO+#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (Lazy.StateT io) = Lazy.StateT (\s -> annotateIO ann (io s))+#endif++-- | @since 1.0.0.0+instance MonadCatch m => MonadCatch (Lazy.StateT s m) where+ catch (Lazy.StateT m) f = Lazy.StateT $ \s -> catch (m s) (\e -> Lazy.runStateT (f e) s)++ -- | general bracket ignores the state produced by the release callback+ generalBracket acquire release use = Lazy.StateT $ \s -> fmap f $+ generalBracket+ (Lazy.runStateT acquire s)+ (\(resource, s') e ->+ case e of+ ExitCaseSuccess (b, s'') ->+ Lazy.runStateT (release resource (ExitCaseSuccess b)) s''+ ExitCaseException err ->+ Lazy.runStateT (release resource (ExitCaseException err)) s'+ ExitCaseAbort ->+ Lazy.runStateT (release resource ExitCaseAbort) s')+ (\(a, s') -> Lazy.runStateT (use a) s')+ where f ((x,_),(y,s)) = ((x,y),s)++-- | @since 1.0.0.0+instance MonadMask m => MonadMask (Lazy.StateT s m) where+ mask f = Lazy.StateT $ \s -> mask $ \u -> Lazy.runStateT (f (q u)) s+ where+ q :: (forall x. m x -> m x)+ -> Lazy.StateT s m a -> Lazy.StateT s m a+ q u (Lazy.StateT b) = Lazy.StateT $ \s -> u (b s)+ uninterruptibleMask f = Lazy.StateT $ \s -> uninterruptibleMask $ \u -> Lazy.runStateT (f (q u)) s+ where+ q :: (forall x. m x -> m x)+ -> Lazy.StateT s m a -> Lazy.StateT s m a+ q u (Lazy.StateT b) = Lazy.StateT $ \s -> u (b s)+++--+-- Strict.StateT instances+--++-- | @since 1.0.0.0+instance MonadCatch m => MonadThrow (Strict.StateT s m) where+ throwIO = lift . throwIO+#if __GLASGOW_HASKELL__ >= 910+ annotateIO ann (Strict.StateT io) = Strict.StateT (\s -> annotateIO ann (io s))+#endif++-- | @since 1.0.0.0+instance MonadCatch m => MonadCatch (Strict.StateT s m) where+ catch (Strict.StateT m) f = Strict.StateT $ \s -> catch (m s) (\e -> Strict.runStateT (f e) s)++ -- | general bracket ignores the state produced by the release callback+ generalBracket acquire release use = Strict.StateT $ \s -> fmap f $+ generalBracket+ (Strict.runStateT acquire s)+ (\(resource, s') e ->+ case e of+ ExitCaseSuccess (b, s'') ->+ Strict.runStateT (release resource (ExitCaseSuccess b)) s''+ ExitCaseException err ->+ Strict.runStateT (release resource (ExitCaseException err)) s'+ ExitCaseAbort ->+ Strict.runStateT (release resource ExitCaseAbort) s')+ (\(a, s') -> Strict.runStateT (use a) s')+ where f ((x,_),(y,s)) = ((x,y),s)++-- | @since 1.0.0.0+instance MonadMask m => MonadMask (Strict.StateT s m) where+ mask f = Strict.StateT $ \s -> mask $ \u -> Strict.runStateT (f (q u)) s+ where+ q :: (forall x. m x -> m x)+ -> Strict.StateT s m a -> Strict.StateT s m a+ q u (Strict.StateT b) = Strict.StateT $ \s -> u (b s)+ uninterruptibleMask f = Strict.StateT $ \s -> uninterruptibleMask $ \u -> Strict.runStateT (f (q u)) s+ where+ q :: (forall x. m x -> m x)+ -> Strict.StateT s m a -> Strict.StateT s m a+ q u (Strict.StateT b) = Strict.StateT $ \s -> u (b s)+
+ mtl/Control/Monad/Class/MonadTime/SI/Trans.hs view
@@ -0,0 +1,40 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Control.Monad.Class.MonadTime.SI.Trans () where++import Control.Monad.Cont (ContT)+import Control.Monad.Except (ExceptT)+import Control.Monad.RWS.Lazy qualified as Lazy+import Control.Monad.RWS.Strict qualified as Strict+import Control.Monad.State.Lazy qualified as Lazy+import Control.Monad.State.Strict qualified as Strict+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy qualified as Lazy+import Control.Monad.Writer.Strict qualified as Strict++import Control.Monad.Class.MonadTime.SI+import Control.Monad.Class.MonadTime.Trans ()++instance MonadMonotonicTime m => MonadMonotonicTime (ExceptT e m) where+ getMonotonicTime = lift getMonotonicTime++instance MonadMonotonicTime m => MonadMonotonicTime (Lazy.StateT s m) where+ getMonotonicTime = lift getMonotonicTime++instance MonadMonotonicTime m => MonadMonotonicTime (Strict.StateT s m) where+ getMonotonicTime = lift getMonotonicTime++instance (Monoid w, MonadMonotonicTime m) => MonadMonotonicTime (Lazy.WriterT w m) where+ getMonotonicTime = lift getMonotonicTime++instance (Monoid w, MonadMonotonicTime m) => MonadMonotonicTime (Strict.WriterT w m) where+ getMonotonicTime = lift getMonotonicTime++instance (Monoid w, MonadMonotonicTime m) => MonadMonotonicTime (Lazy.RWST r w s m) where+ getMonotonicTime = lift getMonotonicTime++instance (Monoid w, MonadMonotonicTime m) => MonadMonotonicTime (Strict.RWST r w s m) where+ getMonotonicTime = lift getMonotonicTime++instance MonadMonotonicTime m => MonadMonotonicTime (ContT r m) where+ getMonotonicTime = lift getMonotonicTime
+ mtl/Control/Monad/Class/MonadTime/Trans.hs view
@@ -0,0 +1,63 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Control.Monad.Class.MonadTime.Trans () where++import Control.Monad.Cont (ContT)+import Control.Monad.Except (ExceptT)+import Control.Monad.RWS.Lazy qualified as Lazy+import Control.Monad.RWS.Strict qualified as Strict+import Control.Monad.State.Lazy qualified as Lazy+import Control.Monad.State.Strict qualified as Strict+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy qualified as Lazy+import Control.Monad.Writer.Strict qualified as Strict++import Control.Monad.Class.MonadTime++instance MonadMonotonicTimeNSec m => MonadMonotonicTimeNSec (ExceptT e m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance MonadMonotonicTimeNSec m => MonadMonotonicTimeNSec (Lazy.StateT s m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance MonadMonotonicTimeNSec m => MonadMonotonicTimeNSec (Strict.StateT s m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance (Monoid w, MonadMonotonicTimeNSec m) => MonadMonotonicTimeNSec (Lazy.WriterT w m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance (Monoid w, MonadMonotonicTimeNSec m) => MonadMonotonicTimeNSec (Strict.WriterT w m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance (Monoid w, MonadMonotonicTimeNSec m) => MonadMonotonicTimeNSec (Lazy.RWST r w s m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance (Monoid w, MonadMonotonicTimeNSec m) => MonadMonotonicTimeNSec (Strict.RWST r w s m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance MonadMonotonicTimeNSec m => MonadMonotonicTimeNSec (ContT r m) where+ getMonotonicTimeNSec = lift getMonotonicTimeNSec++instance MonadTime m => MonadTime (ExceptT e m) where+ getCurrentTime = lift getCurrentTime++instance MonadTime m => MonadTime (Lazy.StateT s m) where+ getCurrentTime = lift getCurrentTime++instance MonadTime m => MonadTime (Strict.StateT s m) where+ getCurrentTime = lift getCurrentTime++instance (Monoid w, MonadTime m) => MonadTime (Lazy.WriterT w m) where+ getCurrentTime = lift getCurrentTime++instance (Monoid w, MonadTime m) => MonadTime (Strict.WriterT w m) where+ getCurrentTime = lift getCurrentTime++instance (Monoid w, MonadTime m) => MonadTime (Lazy.RWST r w s m) where+ getCurrentTime = lift getCurrentTime++instance (Monoid w, MonadTime m) => MonadTime (Strict.RWST r w s m) where+ getCurrentTime = lift getCurrentTime++instance MonadTime m => MonadTime (ContT r m) where+ getCurrentTime = lift getCurrentTime
+ mtl/Control/Monad/Class/MonadTimer/SI/Trans.hs view
@@ -0,0 +1,66 @@+-- undecidable instances needed for 'ContTSTM' instances of+-- 'MonadThrow' and 'MonadCatch' type classes.+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Control.Monad.Class.MonadTimer.SI.Trans () where++import Control.Monad.Cont (ContT (..))+import Control.Monad.Except (ExceptT (..))+import Control.Monad.RWS (RWST (..))+import Control.Monad.State (StateT (..))+import Control.Monad.Trans (lift)+import Control.Monad.Writer (WriterT (..))++import Control.Monad.Class.MonadTimer.SI++import Control.Monad.Class.MonadTime.SI.Trans ()+import Control.Monad.Class.MonadTimer.Trans ()++import Data.Bifunctor (bimap)+++instance MonadDelay m => MonadDelay (ContT r m) where+ threadDelay = lift . threadDelay+instance (Monoid w, MonadDelay m) => MonadDelay (WriterT w m) where+ threadDelay = lift . threadDelay+instance MonadDelay m => MonadDelay (StateT s m) where+ threadDelay = lift . threadDelay+instance MonadDelay m => MonadDelay (ExceptT e m) where+ threadDelay = lift . threadDelay+instance (Monoid w, MonadDelay m) => MonadDelay (RWST r w s m) where+ threadDelay = lift . threadDelay++instance (Monoid w, MonadTimer m) => MonadTimer (WriterT w m) where+ registerDelay = lift . registerDelay+ registerDelayCancellable = fmap (bimap lift lift)+ . lift+ . registerDelayCancellable+ timeout d f = WriterT $ do+ r <- timeout d (runWriterT f)+ return $ case r of+ Nothing -> (Nothing, mempty)+ Just (a, w) -> (Just a, w)++instance MonadTimer m => MonadTimer (StateT s m) where+ registerDelay = lift . registerDelay+ registerDelayCancellable = fmap (bimap lift lift)+ . lift+ . registerDelayCancellable+ timeout d f = StateT $ \s -> do+ r <- timeout d (runStateT f s)+ return $ case r of+ Nothing -> (Nothing, s)+ Just (a, s') -> (Just a, s')++instance (Monoid w, MonadTimer m) => MonadTimer (RWST r w s m) where+ registerDelay = lift . registerDelay+ registerDelayCancellable = fmap (bimap lift lift)+ . lift+ . registerDelayCancellable+ timeout d (RWST f) = RWST $ \r s -> do+ res <- timeout d (f r s)+ return $ case res of+ Nothing -> (Nothing, s, mempty)+ Just (a, s', w) -> (Just a, s', w)+
+ mtl/Control/Monad/Class/MonadTimer/Trans.hs view
@@ -0,0 +1,92 @@+-- undecidable instances needed for 'ContTSTM' instances of+-- 'MonadThrow' and 'MonadCatch' type classes.+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Control.Monad.Class.MonadTimer.Trans () where++import Control.Monad.Cont (ContT (..))+import Control.Monad.Except (ExceptT (..))+import Control.Monad.RWS.Lazy qualified as Lazy+import Control.Monad.RWS.Strict qualified as Strict+import Control.Monad.State.Lazy qualified as Lazy+import Control.Monad.State.Strict qualified as Strict+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy qualified as Lazy+import Control.Monad.Writer.Strict qualified as Strict++import Control.Monad.Class.MonadTimer++import Control.Monad.Class.MonadSTM.Trans ()++instance MonadDelay m => MonadDelay (ContT r m) where+ threadDelay = lift . threadDelay++instance (Monoid w, MonadDelay m) => MonadDelay (Lazy.WriterT w m) where+ threadDelay = lift . threadDelay++instance (Monoid w, MonadDelay m) => MonadDelay (Strict.WriterT w m) where+ threadDelay = lift . threadDelay++instance MonadDelay m => MonadDelay (Lazy.StateT s m) where+ threadDelay = lift . threadDelay++instance MonadDelay m => MonadDelay (Strict.StateT s m) where+ threadDelay = lift . threadDelay++instance MonadDelay m => MonadDelay (ExceptT e m) where+ threadDelay = lift . threadDelay++instance (Monoid w, MonadDelay m) => MonadDelay (Lazy.RWST r w s m) where+ threadDelay = lift . threadDelay++instance (Monoid w, MonadDelay m) => MonadDelay (Strict.RWST r w s m) where+ threadDelay = lift . threadDelay++instance (Monoid w, MonadTimer m) => MonadTimer (Lazy.WriterT w m) where+ registerDelay = lift . registerDelay+ timeout d f = Lazy.WriterT $ do+ r <- timeout d (Lazy.runWriterT f)+ return $ case r of+ Nothing -> (Nothing, mempty)+ Just (a, w) -> (Just a, w)++instance (Monoid w, MonadTimer m) => MonadTimer (Strict.WriterT w m) where+ registerDelay = lift . registerDelay+ timeout d f = Strict.WriterT $ do+ r <- timeout d (Strict.runWriterT f)+ return $ case r of+ Nothing -> (Nothing, mempty)+ Just (a, w) -> (Just a, w)++instance MonadTimer m => MonadTimer (Lazy.StateT s m) where+ registerDelay = lift . registerDelay+ timeout d f = Lazy.StateT $ \s -> do+ r <- timeout d (Lazy.runStateT f s)+ return $ case r of+ Nothing -> (Nothing, s)+ Just (a, s') -> (Just a, s')++instance MonadTimer m => MonadTimer (Strict.StateT s m) where+ registerDelay = lift . registerDelay+ timeout d f = Strict.StateT $ \s -> do+ r <- timeout d (Strict.runStateT f s)+ return $ case r of+ Nothing -> (Nothing, s)+ Just (a, s') -> (Just a, s')++instance (Monoid w, MonadTimer m) => MonadTimer (Lazy.RWST r w s m) where+ registerDelay = lift . registerDelay+ timeout d (Lazy.RWST f) = Lazy.RWST $ \r s -> do+ res <- timeout d (f r s)+ return $ case res of+ Nothing -> (Nothing, s, mempty)+ Just (a, s', w) -> (Just a, s', w)++instance (Monoid w, MonadTimer m) => MonadTimer (Strict.RWST r w s m) where+ registerDelay = lift . registerDelay+ timeout d (Strict.RWST f) = Strict.RWST $ \r s -> do+ res <- timeout d (f r s)+ return $ case res of+ Nothing -> (Nothing, s, mempty)+ Just (a, s', w) -> (Just a, s', w)
+ mtl/Control/Monad/Class/Trans.hs view
@@ -0,0 +1,13 @@+-- | Export all orphaned instances.+--+module Control.Monad.Class.Trans (module X) where++import Control.Monad.Class.MonadEventlog.Trans as X ()+import Control.Monad.Class.MonadSay.Trans as X ()+import Control.Monad.Class.MonadST.Trans as X ()+import Control.Monad.Class.MonadSTM.Trans as X+import Control.Monad.Class.MonadThrow.Trans as X ()+import Control.Monad.Class.MonadTime.SI.Trans as X ()+import Control.Monad.Class.MonadTime.Trans as X ()+import Control.Monad.Class.MonadTimer.SI.Trans as X ()+import Control.Monad.Class.MonadTimer.Trans as X ()
+ si-timers/src/Control/Monad/Class/MonadTime/SI.hs view
@@ -0,0 +1,76 @@+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE NumericUnderscores #-}++module Control.Monad.Class.MonadTime.SI+ ( MonadTime (..)+ , MonadMonotonicTime (..)+ -- * 'DiffTime' and its action on 'Time'+ , Time (..)+ , diffTime+ , addTime+ , DiffTime+ -- * 'NominalTime' and its action on 'UTCTime'+ , UTCTime+ , diffUTCTime+ , addUTCTime+ , NominalDiffTime+ ) where++import Control.DeepSeq (NFData (..))+import Control.Monad.Reader++import Control.Monad.Class.MonadTime (MonadMonotonicTimeNSec, MonadTime (..),+ NominalDiffTime, UTCTime, addUTCTime, diffUTCTime)+import Control.Monad.Class.MonadTime qualified as MonadTime++import NoThunks.Class (NoThunks (..))++import Data.Time.Clock (DiffTime)+import Data.Time.Clock qualified as Time+import Data.Word (Word64)+import GHC.Generics (Generic (..))+++-- | A point in time in a monotonic clock.+--+-- The epoch for this clock is arbitrary and does not correspond to any wall+-- clock or calendar, and is /not guaranteed/ to be the same epoch across+-- program runs. It is represented as the 'DiffTime' from this arbitrary epoch.+--+newtype Time = Time DiffTime+ deriving stock (Eq, Ord, Show, Generic)+ deriving newtype NFData+ deriving anyclass NoThunks++-- | The time duration between two points in time (positive or negative).+diffTime :: Time -> Time -> DiffTime+diffTime (Time t) (Time t') = t - t'++-- | Add a duration to a point in time, giving another time.+addTime :: DiffTime -> Time -> Time+addTime d (Time t) = Time (d + t)++infixr 9 `addTime`++class MonadMonotonicTimeNSec m => MonadMonotonicTime m where+ getMonotonicTime :: m Time++ default getMonotonicTime :: m Time+ getMonotonicTime =+ conv <$> MonadTime.getMonotonicTimeNSec+ where+ conv :: Word64 -> Time+ conv = Time . Time.picosecondsToDiffTime . (* 1_000) . toInteger++instance MonadMonotonicTime IO where++--+-- MTL instances+--++instance MonadMonotonicTime m => MonadMonotonicTime (ReaderT r m) where+ getMonotonicTime = lift getMonotonicTime
+ si-timers/src/Control/Monad/Class/MonadTimer/NonStandard.hs view
@@ -0,0 +1,168 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE NumericUnderscores #-}+{-# LANGUAGE TypeFamilies #-}++#if defined(__GLASGOW_HASKELL__) && \+ !defined(mingw32_HOST_OS) && \+ !defined(__GHCJS__) && \+ !defined(js_HOST_ARCH) && \+ !defined(wasm32_HOST_ARCH)+#define GHC_TIMERS_API+#endif++-- | A non-standard interface for timer api.+--+-- This module also provides a polyfill which allows to use timer api also on+-- non-threaded RTS regardless of the architecture \/ OS. Currently we support+-- `*nix`, `macOS`, `Windows` (and, unofficially `GHCJS`).+--+-- We use it to provide @'Control.Monad.Class.MonadTimer.MonadTimer' 'IO'@+-- instance and to implement a cancellable timers, see+-- 'Control.Monad.Class.MonadTimer.SI.registerDelayCancellable'.+--+-- You can expect we will deprecate it at some point (e.g. once GHC gets+-- a better support for timers especially across different execution+-- environments).+--+module Control.Monad.Class.MonadTimer.NonStandard+ ( TimeoutState (..)+ , newTimeout+ , readTimeout+ , cancelTimeout+ , awaitTimeout+ , NewTimeout+ , ReadTimeout+ , CancelTimeout+ , AwaitTimeout+ ) where++import Control.Concurrent.STM qualified as STM+#ifndef GHC_TIMERS_API+import Control.Monad (when)+#endif+import Control.Monad.Class.MonadSTM++#ifdef GHC_TIMERS_API+import GHC.Event qualified as GHC (TimeoutKey, getSystemTimerManager,+ registerTimeout, unregisterTimeout)+#else+import GHC.Conc.IO qualified as GHC (registerDelay)+#endif+++-- | State of a timeout: pending, fired or cancelled.+--+data TimeoutState = TimeoutPending | TimeoutFired | TimeoutCancelled+ deriving (Eq, Ord, Show)+++-- | The type of the timeout handle, used with 'newTimeout', 'readTimeout', and+-- 'cancelTimeout'.+--+#ifdef GHC_TIMERS_API+data Timeout = TimeoutIO !(STM.TVar TimeoutState) !GHC.TimeoutKey+#else+data Timeout = TimeoutIO !(STM.TVar (STM.TVar Bool)) !(STM.TVar Bool)+#endif++-- | Create a new timeout which will fire at the given time duration in+-- the future.+--+-- The timeout will start in the 'TimeoutPending' state and either+-- fire at or after the given time leaving it in the 'TimeoutFired' state,+-- or it may be cancelled with 'cancelTimeout', leaving it in the+-- 'TimeoutCancelled' state.+--+-- Timeouts /cannot/ be reset to the pending state once fired or cancelled+-- (as this would be very racy). You should create a new timeout if you need+-- this functionality.+--+-- When native timer manager is supported (on `*nix` systems), it only holds+-- a `TVar` with `TimeoutState` and `GHC.TimeoutKey`.+--+newTimeout :: NewTimeout IO Timeout+type NewTimeout m timeout = Int -> m timeout+++-- | Read the current state of a timeout. This does not block, but returns+-- the current state. It is your responsibility to use 'retry' to wait.+--+-- Alternatively you may wish to use the convenience utility 'awaitTimeout'+-- to wait for just the fired or cancelled outcomes.+--+-- You should consider the cancelled state if you plan to use 'cancelTimeout'.+--+readTimeout :: ReadTimeout IO Timeout+type ReadTimeout m timeout = timeout -> STM m TimeoutState+++-- | Cancel a timeout (unless it has already fired), putting it into the+-- 'TimeoutCancelled' state. Code reading and acting on the timeout state+-- need to handle such cancellation appropriately.+--+-- It is safe to race this concurrently against the timer firing. It will+-- have no effect if the timer fires first.+--+cancelTimeout :: CancelTimeout IO Timeout+type CancelTimeout m timeout = timeout -> m ()++-- | Returns @True@ when the timeout is fired, or @False@ if it is cancelled.+awaitTimeout :: AwaitTimeout IO Timeout+type AwaitTimeout m timeout = timeout -> STM m Bool+++#ifdef GHC_TIMERS_API++readTimeout (TimeoutIO var _key) = STM.readTVar var++newTimeout = \d -> do+ var <- STM.newTVarIO TimeoutPending+ mgr <- GHC.getSystemTimerManager+ key <- GHC.registerTimeout mgr d (STM.atomically (timeoutAction var))+ return (TimeoutIO var key)+ where+ timeoutAction var = do+ x <- STM.readTVar var+ case x of+ TimeoutPending -> STM.writeTVar var TimeoutFired+ TimeoutFired -> error "MonadTimer(IO): invariant violation"+ TimeoutCancelled -> return ()++cancelTimeout (TimeoutIO var key) = do+ STM.atomically $ do+ x <- STM.readTVar var+ case x of+ TimeoutPending -> STM.writeTVar var TimeoutCancelled+ TimeoutFired -> return ()+ TimeoutCancelled -> return ()+ mgr <- GHC.getSystemTimerManager+ GHC.unregisterTimeout mgr key++#else++readTimeout (TimeoutIO timeoutvarvar cancelvar) = do+ canceled <- STM.readTVar cancelvar+ fired <- STM.readTVar =<< STM.readTVar timeoutvarvar+ case (canceled, fired) of+ (True, _) -> return TimeoutCancelled+ (_, False) -> return TimeoutPending+ (_, True) -> return TimeoutFired++newTimeout d = do+ timeoutvar <- GHC.registerDelay d+ timeoutvarvar <- STM.newTVarIO timeoutvar+ cancelvar <- STM.newTVarIO False+ return (TimeoutIO timeoutvarvar cancelvar)++cancelTimeout (TimeoutIO timeoutvarvar cancelvar) =+ STM.atomically $ do+ fired <- STM.readTVar =<< STM.readTVar timeoutvarvar+ when (not fired) $ STM.writeTVar cancelvar True++#endif++awaitTimeout t = do s <- readTimeout t+ case s of+ TimeoutPending -> retry+ TimeoutFired -> return True+ TimeoutCancelled -> return False
+ si-timers/src/Control/Monad/Class/MonadTimer/SI.hs view
@@ -0,0 +1,273 @@+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE NumericUnderscores #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Control.Monad.Class.MonadTimer.SI+ ( -- * Type classes+ MonadDelay (..)+ , MonadTimer (..)+ -- * Auxiliary functions+ , diffTimeToMicrosecondsAsInt+ , microsecondsAsIntToDiffTime+ -- * Re-exports+ , DiffTime+ , MonadFork+ , MonadMonotonicTime+ , MonadTime+ , TimeoutState (..)+ -- * Default implementations+ , defaultRegisterDelay+ , defaultRegisterDelayCancellable+ ) where++import Control.Concurrent.Class.MonadSTM+import Control.Exception (assert)+import Control.Monad.Class.MonadFork+import Control.Monad.Class.MonadTime.SI+import Control.Monad.Class.MonadTimer qualified as MonadTimer+import Control.Monad.Class.MonadTimer.NonStandard (TimeoutState (..))+import Control.Monad.Class.MonadTimer.NonStandard qualified as NonStandard++import Control.Monad.Reader++import Data.Bifunctor (bimap)+import Data.Functor (($>))+import Data.Time.Clock (diffTimeToPicoseconds)++++-- | Convert 'DiffTime' in seconds to microseconds represented by an 'Int'.+--+-- Note that on 32bit systems it can only represent `2^31-1` seconds, which is+-- only ~35 minutes.+--+-- It doesn't prevent under- or overflows; when assertions are on it will thrown+-- an assertion exception.+--+diffTimeToMicrosecondsAsInt :: DiffTime -> Int+diffTimeToMicrosecondsAsInt d =+ let usec :: Integer+ usec = diffTimeToPicoseconds d `div` 1_000_000 in+ assert (usec <= fromIntegral (maxBound :: Int)+ && usec >= fromIntegral (minBound :: Int)) $+ fromIntegral usec+++-- | Convert time in microseconds in 'DiffTime' (measured in seconds).+--+microsecondsAsIntToDiffTime :: Int -> DiffTime+microsecondsAsIntToDiffTime = (/ 1_000_000) . fromIntegral++class ( MonadTimer.MonadDelay m+ , MonadMonotonicTime m+ ) => MonadDelay m where+ threadDelay :: DiffTime -> m ()++-- | Thread delay. This implementation will not over- or underflow.+--+-- For delay larger than what `Int` can represent (see+-- `diffTimeToMicrosecondsAsInt`), it will recursively call+-- `Control.Monad.Class.MonadTimer.threadDelay`.+--+-- For delays smaller than `minBound :: Int` seconds, `minBound :: Int` will be+-- used instead.+--+instance MonadDelay IO where+ threadDelay :: forall m.+ MonadDelay m+ => DiffTime -> m ()+ threadDelay d | d <= 0 = return ()++ threadDelay d | d <= maxDelay =+ MonadTimer.threadDelay (diffTimeToMicrosecondsAsInt d)+ where+ maxDelay :: DiffTime+ maxDelay = microsecondsAsIntToDiffTime maxBound++ threadDelay d = do+ c <- getMonotonicTime+ let u = d `addTime` c+ go c u+ where+ maxDelay :: DiffTime+ maxDelay = microsecondsAsIntToDiffTime maxBound++ go :: Time -> Time -> m ()+ go c u = do+ if d' >= maxDelay+ then do+ MonadTimer.threadDelay maxBound+ c' <- getMonotonicTime+ go c' u+ else+ MonadTimer.threadDelay (diffTimeToMicrosecondsAsInt d')+ where+ d' = u `diffTime` c++instance MonadDelay m => MonadDelay (ReaderT r m) where+ threadDelay = lift . threadDelay++class ( MonadTimer.MonadTimer m+ , MonadMonotonicTime m+ ) => MonadTimer m where++ -- | A register delay function which safe on 32-bit systems.+ registerDelay :: DiffTime -> m (TVar m Bool)++ -- | A cancellable register delay which is safe on 32-bit systems and efficient+ -- for delays smaller than what `Int` can represent (especially on systems which+ -- support native timer manager).+ --+ registerDelayCancellable :: DiffTime -> m (STM m TimeoutState, m ())++ -- | A timeout function.+ --+ -- TODO: 'IO' instance is not safe on 32-bit systems.+ timeout :: DiffTime -> m a -> m (Maybe a)+++-- | A default implementation of `registerDelay` which supports delays longer+-- then `Int`; this is especially important on 32-bit systems where maximum+-- delay expressed in microseconds is around 35 minutes.+--+defaultRegisterDelay :: forall m timeout.+ ( MonadFork m+ , MonadMonotonicTime m+ , MonadSTM m+ )+ => NonStandard.NewTimeout m timeout+ -> NonStandard.AwaitTimeout m timeout+ -> DiffTime+ -> m (TVar m Bool)+defaultRegisterDelay newTimeout awaitTimeout d = do+ c <- getMonotonicTime+ v <- atomically $ newTVar False+ tid <- forkIO $ go v c (d `addTime` c)+ labelThread tid "delay-thread"+ return v+ where+ maxDelay :: DiffTime+ maxDelay = microsecondsAsIntToDiffTime maxBound++ go :: TVar m Bool -> Time -> Time -> m ()+ go v c u | u `diffTime` c >= maxDelay = do+ _ <- newTimeout maxBound >>= atomically . awaitTimeout+ c' <- getMonotonicTime+ go v c' u++ go v c u = do+ t <- newTimeout (diffTimeToMicrosecondsAsInt $ u `diffTime` c)+ atomically $ do+ _ <- awaitTimeout t+ writeTVar v True+++-- | A cancellable register delay which is safe on 32-bit systems and efficient+-- for delays smaller than what `Int` can represent (especially on systems which+-- support native timer manager).+--+defaultRegisterDelayCancellable :: forall m timeout.+ ( MonadFork m+ , MonadMonotonicTime m+ , MonadSTM m+ )+ => NonStandard.NewTimeout m timeout+ -> NonStandard.ReadTimeout m timeout+ -> NonStandard.CancelTimeout m timeout+ -> NonStandard.AwaitTimeout m timeout+ -> DiffTime+ -> m (STM m TimeoutState, m ())++defaultRegisterDelayCancellable newTimeout readTimeout cancelTimeout _awaitTimeout d | d <= maxDelay = do+ t <- newTimeout (diffTimeToMicrosecondsAsInt d)+ return (readTimeout t, cancelTimeout t)+ where+ maxDelay :: DiffTime+ maxDelay = microsecondsAsIntToDiffTime maxBound++defaultRegisterDelayCancellable newTimeout _readTimeout _cancelTimeout awaitTimeout d = do+ -- current time+ c <- getMonotonicTime+ -- timeout state+ v <- newTVarIO TimeoutPending+ tid <- forkIO $ go v c (d `addTime` c)+ labelThread tid "delay-thread"+ let cancel = atomically $ readTVar v >>= \case+ TimeoutCancelled -> return ()+ TimeoutFired -> return ()+ TimeoutPending -> writeTVar v TimeoutCancelled+ return (readTVar v, cancel)+ where+ maxDelay :: DiffTime+ maxDelay = microsecondsAsIntToDiffTime maxBound++ go :: TVar m TimeoutState+ -> Time+ -> Time+ -> m ()+ go v c u | u `diffTime` c >= maxDelay = do+ t <- newTimeout maxBound+ ts <- atomically $ do+ (readTVar v >>= \case+ a@TimeoutCancelled -> return a+ TimeoutFired -> error "registerDelayCancellable: invariant violation!"+ TimeoutPending -> retry)+ `orElse`+ -- the overall timeout is still pending when 't' fires+ (awaitTimeout t $> TimeoutPending)+ case ts of+ TimeoutPending -> do+ c' <- getMonotonicTime+ go v c' u+ _ -> return ()++ go v c u = do+ t <- newTimeout (diffTimeToMicrosecondsAsInt $ u `diffTime` c)+ atomically $ do+ ts <- (readTVar v >>= \case+ a@TimeoutCancelled -> return a+ TimeoutFired -> error "registerDelayCancellable: invariant violation!"+ TimeoutPending -> retry)+ `orElse`+ -- the overall timeout fires when 't' fires+ (awaitTimeout t $> TimeoutFired)+ case ts of+ TimeoutFired -> writeTVar v TimeoutFired+ _ -> return ()+++-- | Like 'GHC.Conc.registerDelay' but safe on 32-bit systems. When the delay+-- is larger than what `Int` can represent it will fork a thread which will+-- write to the returned 'TVar' once the delay has passed. When the delay is+-- small enough it will use the `MonadTimer`'s `registerDelay` (e.g. for `IO`+-- monad it will use the `GHC`'s `GHC.Conc.registerDelay`).+--+-- TODO: 'timeout' not safe on 32-bit systems.+instance MonadTimer IO where+ registerDelay d+ | d <= maxDelay =+ MonadTimer.registerDelay (diffTimeToMicrosecondsAsInt d)+ | otherwise =+ defaultRegisterDelay+ NonStandard.newTimeout+ NonStandard.awaitTimeout+ d+ where+ maxDelay :: DiffTime+ maxDelay = microsecondsAsIntToDiffTime maxBound++ registerDelayCancellable =+ defaultRegisterDelayCancellable+ NonStandard.newTimeout+ NonStandard.readTimeout+ NonStandard.cancelTimeout+ NonStandard.awaitTimeout++ timeout = MonadTimer.timeout . diffTimeToMicrosecondsAsInt++instance MonadTimer m => MonadTimer (ReaderT r m) where+ registerDelay = lift . registerDelay+ registerDelayCancellable = fmap (bimap lift lift) . lift . registerDelayCancellable+ timeout d f = ReaderT $ \r -> timeout d (runReaderT f r)
+ si-timers/test/Main.hs view
@@ -0,0 +1,15 @@+module Main (main) where++import Test.Tasty++import Test.MonadTimer qualified++main :: IO ()+main = defaultMain tests++tests :: TestTree+tests =+ testGroup "io-classes"+ [ Test.MonadTimer.tests+ ]+
+ si-timers/test/Test/MonadTimer.hs view
@@ -0,0 +1,90 @@+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE NumericUnderscores #-}++module Test.MonadTimer (tests) where++import Control.Monad.Class.MonadTimer.SI+import GHC.Real++import Test.QuickCheck+import Test.Tasty+import Test.Tasty.QuickCheck (testProperty)++tests :: TestTree+tests =+ testGroup "Control.Monad.Class.MonadTimer"+ [ testProperty "diffTimeToMicroseconds left inverse"+ prop_diffTimeToMicrosecondsAsIntLeftInverse+ , testProperty "diffTimeToMicroseconds right inverse"+ prop_diffTimeToMicrosecondsAsIntRightInverse+ ]++newtype IntDistr = IntDistr Int+ deriving (Show, Eq)++instance Arbitrary IntDistr where+ arbitrary = oneof+ [ IntDistr <$> arbitrary+ , IntDistr . (maxBound - ) . getNonNegative <$> (arbitrary :: Gen (NonNegative Int))+ , IntDistr . (minBound + ) . getNonNegative <$> (arbitrary :: Gen (NonNegative Int))+ ]++ shrink (IntDistr a) = IntDistr `map` shrink a++prop_diffTimeToMicrosecondsAsIntLeftInverse :: IntDistr -> Bool+prop_diffTimeToMicrosecondsAsIntLeftInverse (IntDistr usec) =+ usec == diffTimeToMicrosecondsAsInt (microsecondsAsIntToDiffTime usec)+++newtype DiffTimeDistr = DiffTimeDistr DiffTime+ deriving (Show, Eq)++instance Arbitrary DiffTimeDistr where+ arbitrary = frequency+ [ -- arbitrary DiffTime+ (6, DiffTimeDistr . fromRational <$> arbitrary)+ -- large positive DiffTimes, but smaller than `maxBound :: Int` microseconds+ , (3, DiffTimeDistr+ . (fromRational (toRational (maxBound :: Int) / 1_000_000) - )+ . fromRational+ . getNonNegative+ <$> resize 100 arbitrary+ )+ -- large negative DiffTimes, but larger than `minBound :: Int` microseconds+ , (3, DiffTimeDistr+ . (fromRational (toRational (minBound :: Int) / 1_000_000) + )+ . fromRational+ . getNonNegative+ <$> arbitrary+ )+ -- smaller than 1 :% 1_000_000+ , (1, DiffTimeDistr . fromRational . (/ 1_000_000) <$> resize 1 arbitrary)+ ]++ shrink (DiffTimeDistr a) = (DiffTimeDistr . fromRational) `map` shrink (toRational a)++prop_diffTimeToMicrosecondsAsIntRightInverse :: DiffTimeDistr -> Property+prop_diffTimeToMicrosecondsAsIntRightInverse (DiffTimeDistr a) =+ label (labelRational (toRational a)) $+ abs (toRational a - a') < (1 :% 1_000_000)+ .&&.+ r === microsecondsAsIntToDiffTime (diffTimeToMicrosecondsAsInt r)+++ where+ a' = toRational (microsecondsAsIntToDiffTime (diffTimeToMicrosecondsAsInt a))++ -- 'a' rounded to microseconds+ r :: DiffTime+ r = fromRational (toRational x / 1_000_000)+ where+ x :: Integer+ x = round $ (toRational a * 1_000_000)++ labelRational x =+ if | abs x < 1 :% 1_000_000+ -> "small"+ | abs x > toRational (maxBound :: Int) / 1_000_000 - 100+ -> "large"+ | otherwise+ -> "average"
src/Control/Monad/Class/MonadThrow.hs view
@@ -57,6 +57,9 @@ bracket_ :: m a -> m b -> m c -> m c finally :: m a -> m b -> m a #if __GLASGOW_HASKELL__ >= 910+ -- | See 'IO.annotateIO'.+ --+ -- @since 1.5.0.0 annotateIO :: forall e a. ExceptionAnnotation e => e -> m a -> m a #endif
+ strict-mvar/README.md view
@@ -0,0 +1,7 @@+# Strict Mutable Variables++The `io-classes:strict-mvar` package provides a strict interface to mutable+variables (`MVar`). It builds on top of `io-classes:io-classes`, and thus it+provides the interface for `MVar`s implementations from both+[base](https://hackage.haskell.org/package/base-4.17.0.0/docs/Control-Concurrent-MVar.html)+and [io-sim](https://github.com/input-output-hk/io-sim).
+ strict-mvar/src/Control/Concurrent/Class/MonadMVar/Strict.hs view
@@ -0,0 +1,127 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}++-- | This module corresponds to "Control.Concurrent.MVar" in the @base@ package.+module Control.Concurrent.Class.MonadMVar.Strict+ ( -- * StrictMVar+ StrictMVar+ , LazyMVar+ , castStrictMVar+ , toLazyMVar+ , fromLazyMVar+ , newEmptyMVar+ , newMVar+ , takeMVar+ , putMVar+ , readMVar+ , swapMVar+ , tryTakeMVar+ , tryPutMVar+ , isEmptyMVar+ , withMVar+ , withMVarMasked+ , modifyMVar_+ , modifyMVar+ , modifyMVarMasked_+ , modifyMVarMasked+ , tryReadMVar+ -- * Re-exports+ , MonadMVar+ ) where++import Control.Concurrent.Class.MonadMVar (MonadMVar)+import Control.Concurrent.Class.MonadMVar qualified as Lazy++--+-- StrictMVar+--++type LazyMVar m = Lazy.MVar m++newtype StrictMVar m a = StrictMVar {+ mvar :: LazyMVar m a+ }++castStrictMVar :: LazyMVar m ~ LazyMVar n+ => StrictMVar m a -> StrictMVar n a+castStrictMVar v = StrictMVar (mvar v)++-- | Get the underlying @MVar@+--+-- Since we obviously cannot guarantee that updates to this 'LazyMVar' will be+-- strict, this should be used with caution.+toLazyMVar :: StrictMVar m a -> LazyMVar m a+toLazyMVar = mvar++-- | Create a 'StrictMVar' from a 'LazyMVar'+--+-- It is not guaranteed that the 'LazyMVar' contains a value that is in WHNF, so+-- there is no guarantee that the resulting 'StrictMVar' contains a value that+-- is in WHNF. This should be used with caution.+fromLazyMVar :: Lazy.MVar m a -> StrictMVar m a+fromLazyMVar = StrictMVar++newEmptyMVar :: MonadMVar m => m (StrictMVar m a)+newEmptyMVar = fromLazyMVar <$> Lazy.newEmptyMVar++newMVar :: MonadMVar m => a -> m (StrictMVar m a)+newMVar !a = fromLazyMVar <$> Lazy.newMVar a++takeMVar :: MonadMVar m => StrictMVar m a -> m a+takeMVar = Lazy.takeMVar . mvar++putMVar :: MonadMVar m => StrictMVar m a -> a -> m ()+putMVar v !a = Lazy.putMVar (mvar v) a++readMVar :: MonadMVar m => StrictMVar m a -> m a+readMVar v = Lazy.readMVar (mvar v)++swapMVar :: MonadMVar m => StrictMVar m a -> a -> m a+swapMVar v !a = Lazy.swapMVar (mvar v) a++tryTakeMVar :: MonadMVar m => StrictMVar m a -> m (Maybe a)+tryTakeMVar v = Lazy.tryTakeMVar (mvar v)++tryPutMVar :: MonadMVar m => StrictMVar m a -> a -> m Bool+tryPutMVar v !a = Lazy.tryPutMVar (mvar v) a++isEmptyMVar :: MonadMVar m => StrictMVar m a -> m Bool+isEmptyMVar v = Lazy.isEmptyMVar (mvar v)++withMVar :: MonadMVar m => StrictMVar m a -> (a -> m b) -> m b+withMVar v = Lazy.withMVar (mvar v)++withMVarMasked :: MonadMVar m => StrictMVar m a -> (a -> m b) -> m b+withMVarMasked v = Lazy.withMVarMasked (mvar v)++modifyMVar_ :: MonadMVar m => StrictMVar m a -> (a -> m a) -> m ()+modifyMVar_ v io = Lazy.modifyMVar_ (mvar v) io'+ where+ io' a = do+ !a' <- io a+ pure a'++modifyMVar :: MonadMVar m => StrictMVar m a -> (a -> m (a, b)) -> m b+modifyMVar v io = Lazy.modifyMVar (mvar v) io'+ where+ io' a = do+ (!a', b) <- io a+ pure (a', b)++modifyMVarMasked_ :: MonadMVar m => StrictMVar m a -> (a -> m a) -> m ()+modifyMVarMasked_ v io = Lazy.modifyMVarMasked_ (mvar v) io'+ where+ io' a = do+ !a' <- io a+ pure a'++modifyMVarMasked :: MonadMVar m => StrictMVar m a -> (a -> m (a,b)) -> m b+modifyMVarMasked v io = Lazy.modifyMVarMasked (mvar v) io'+ where+ io' a = do+ (!a', b) <- io a+ pure (a', b)++tryReadMVar :: MonadMVar m => StrictMVar m a -> m (Maybe a)+tryReadMVar v = Lazy.tryReadMVar (mvar v)
+ strict-mvar/test/Main.hs view
@@ -0,0 +1,35 @@+module Main where++import Test.Control.Concurrent.Class.MonadMVar.Strict.WHNF++import Test.QuickCheck.Monadic (monadicIO)+import Test.Tasty+import Test.Tasty.QuickCheck+++main :: IO ()+main = defaultMain $ testGroup "strict-mvar" [tests]++tests :: TestTree+tests = testGroup "Test.Control.Concurrent.Class.MonadMVar.Strict"+ [ testGroup "WHNF"+ [ testGroup "IO"+ [ testProperty "prop_newMVar" $+ monadicIO .: prop_newMVar+ , testProperty "prop_putMVar" $+ monadicIO .: prop_putMVar+ , testProperty "prop_swapMVar" $+ monadicIO .: prop_swapMVar+ , testProperty "prop_tryPutMVar" $+ monadicIO .: prop_tryPutMVar+ , testProperty "prop_modifyMVar_" $+ monadicIO .: prop_modifyMVar_+ , testProperty "prop_modifyMVar" $+ monadicIO .: prop_modifyMVar+ , testProperty "prop_modifyMVarMasked_" $+ monadicIO .: prop_modifyMVarMasked_+ , testProperty "prop_modifyMVarMasked" $+ monadicIO .: prop_modifyMVarMasked+ ]+ ]+ ]
+ strict-stm/Control/Concurrent/Class/MonadSTM/Strict.hs view
@@ -0,0 +1,15 @@+-- | This module corresponds to `Control.Concurrent.STM` in "stm" package+--+module Control.Concurrent.Class.MonadSTM.Strict (module STM) where++import Control.Concurrent.Class.MonadSTM.Strict.TArray as STM+import Control.Concurrent.Class.MonadSTM.Strict.TBQueue as STM+import Control.Concurrent.Class.MonadSTM.Strict.TChan as STM+import Control.Concurrent.Class.MonadSTM.Strict.TMVar as STM+import Control.Concurrent.Class.MonadSTM.Strict.TQueue as STM+import Control.Concurrent.Class.MonadSTM.Strict.TVar as STM+import Control.Monad.Class.MonadSTM as STM hiding (traceTBQueue, traceTBQueueIO,+ traceTMVar, traceTMVarIO, traceTQueue, traceTQueueIO, traceTVar,+ traceTVarIO)++
+ strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TArray.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE ExplicitNamespaces #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}++-- | This module corresponds to `Control.Concurrent.STM.TArray` in "stm" package+--+module Control.Concurrent.Class.MonadSTM.Strict.TArray+ ( StrictTArray+ , LazyTArray+ , toLazyTArray+ , fromLazyTArray+ ) where+++import Control.Concurrent.Class.MonadSTM.TArray qualified as Lazy++import Data.Array.Base (MArray (..))+++type LazyTArray m = Lazy.TArray m++newtype StrictTArray m i e = StrictTArray { toLazyTArray :: LazyTArray m i e }++fromLazyTArray :: LazyTArray m i e -> StrictTArray m i e+fromLazyTArray = StrictTArray++instance ( MArray (Lazy.TArray m) e stm+ , Monad stm+ )+ => MArray (StrictTArray m) e stm where+ getBounds (StrictTArray arr) = getBounds arr+ newArray b !e = StrictTArray <$> newArray b e+ newArray_ b = StrictTArray <$> newArray_ b+ unsafeRead (StrictTArray arr) i = unsafeRead arr i+ unsafeWrite (StrictTArray arr) i !e = unsafeWrite arr i e+ getNumElements (StrictTArray arr) = getNumElements arr+
+ strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TBQueue.hs view
@@ -0,0 +1,106 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE ExplicitNamespaces #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeOperators #-}++-- | This module corresponds to `Control.Concurrent.STM.TBQueue` in "stm" package+--+module Control.Concurrent.Class.MonadSTM.Strict.TBQueue+ ( -- * MonadSTM+ StrictTBQueue+ , LazyTBQueue+ , toLazyTBQueue+ , fromLazyTBQueue+ , castStrictTBQueue+ , newTBQueue+ , newTBQueueIO+ , readTBQueue+ , tryReadTBQueue+ , peekTBQueue+ , tryPeekTBQueue+ , flushTBQueue+ , writeTBQueue+ , lengthTBQueue+ , isEmptyTBQueue+ , isFullTBQueue+ , unGetTBQueue+ -- * MonadLabelledSTM+ , labelTBQueue+ , labelTBQueueIO+ -- * MonadTraceSTM+ , traceTBQueue+ , traceTBQueueIO+ ) where+++import Control.Concurrent.Class.MonadSTM.TBQueue qualified as Lazy+import Control.Monad.Class.MonadSTM hiding (traceTBQueue, traceTBQueueIO)++import Numeric.Natural (Natural)+++type LazyTBQueue m = Lazy.TBQueue m++newtype StrictTBQueue m a = StrictTBQueue { toLazyTBQueue :: LazyTBQueue m a }++fromLazyTBQueue :: LazyTBQueue m a -> StrictTBQueue m a+fromLazyTBQueue = StrictTBQueue++castStrictTBQueue :: LazyTBQueue m ~ LazyTBQueue n+ => StrictTBQueue m a -> StrictTBQueue n a+castStrictTBQueue (StrictTBQueue var) = StrictTBQueue var++labelTBQueue :: MonadLabelledSTM m => StrictTBQueue m a -> String -> STM m ()+labelTBQueue (StrictTBQueue queue) = Lazy.labelTBQueue queue++labelTBQueueIO :: MonadLabelledSTM m => StrictTBQueue m a -> String -> m ()+labelTBQueueIO (StrictTBQueue queue) = Lazy.labelTBQueueIO queue++traceTBQueue :: MonadTraceSTM m+ => proxy m+ -> StrictTBQueue m a+ -> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)+ -> STM m ()+traceTBQueue p (StrictTBQueue queue) = Lazy.traceTBQueue p queue++traceTBQueueIO :: MonadTraceSTM m+ => StrictTBQueue m a+ -> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)+ -> m ()+traceTBQueueIO (StrictTBQueue queue) = Lazy.traceTBQueueIO queue++newTBQueue :: MonadSTM m => Natural -> STM m (StrictTBQueue m a)+newTBQueue n = StrictTBQueue <$> Lazy.newTBQueue n++newTBQueueIO :: MonadSTM m => Natural -> m (StrictTBQueue m a)+newTBQueueIO = atomically . newTBQueue++readTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m a+readTBQueue = Lazy.readTBQueue . toLazyTBQueue++tryReadTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m (Maybe a)+tryReadTBQueue = Lazy.tryReadTBQueue . toLazyTBQueue++peekTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m a+peekTBQueue = Lazy.peekTBQueue . toLazyTBQueue++tryPeekTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m (Maybe a)+tryPeekTBQueue = Lazy.tryPeekTBQueue . toLazyTBQueue++flushTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m [a]+flushTBQueue = Lazy.flushTBQueue . toLazyTBQueue++writeTBQueue :: MonadSTM m => StrictTBQueue m a -> a -> STM m ()+writeTBQueue (StrictTBQueue tqueue) !a = Lazy.writeTBQueue tqueue a++lengthTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Natural+lengthTBQueue = Lazy.lengthTBQueue . toLazyTBQueue++isEmptyTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Bool+isEmptyTBQueue = Lazy.isEmptyTBQueue . toLazyTBQueue++isFullTBQueue :: MonadSTM m => StrictTBQueue m a -> STM m Bool+isFullTBQueue = Lazy.isFullTBQueue . toLazyTBQueue++unGetTBQueue :: MonadSTM m => StrictTBQueue m a -> a -> STM m ()+unGetTBQueue (StrictTBQueue queue) !a = Lazy.unGetTBQueue queue a
+ strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TChan.hs view
@@ -0,0 +1,75 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE ExplicitNamespaces #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE TypeOperators #-}++-- | This module corresponds to `Control.Concurrent.STM.TChan` in "stm" package+--+module Control.Concurrent.Class.MonadSTM.Strict.TChan+ ( StrictTChan+ , LazyTChan+ , toLazyTChan+ , fromLazyTChan+ , castStrictTChan+ , newTChan+ , newBroadcastTChan+ , writeTChan+ , readTChan+ , tryReadTChan+ , peekTChan+ , tryPeekTChan+ , dupTChan+ , unGetTChan+ , isEmptyTChan+ , cloneTChan+ ) where+++import Control.Concurrent.Class.MonadSTM.TChan qualified as Lazy+import Control.Monad.Class.MonadSTM+++type LazyTChan m = Lazy.TChan m++newtype StrictTChan m a = StrictTChan { toLazyTChan :: LazyTChan m a }++fromLazyTChan :: LazyTChan m a -> StrictTChan m a+fromLazyTChan = StrictTChan++castStrictTChan :: LazyTChan m ~ LazyTChan n+ => StrictTChan m a -> StrictTChan n a+castStrictTChan (StrictTChan var) = StrictTChan var++newTChan :: MonadSTM m => STM m (StrictTChan m a)+newTChan = StrictTChan <$> Lazy.newTChan++newBroadcastTChan :: MonadSTM m => STM m (StrictTChan m a)+newBroadcastTChan = StrictTChan <$> Lazy.newBroadcastTChan++writeTChan :: MonadSTM m => StrictTChan m a -> a -> STM m ()+writeTChan (StrictTChan chan) !a = Lazy.writeTChan chan a++readTChan :: MonadSTM m => StrictTChan m a -> STM m a+readTChan = Lazy.readTChan . toLazyTChan++tryReadTChan :: MonadSTM m => StrictTChan m a -> STM m (Maybe a)+tryReadTChan = Lazy.tryReadTChan . toLazyTChan++peekTChan :: MonadSTM m => StrictTChan m a -> STM m a+peekTChan = Lazy.peekTChan . toLazyTChan++tryPeekTChan :: MonadSTM m => StrictTChan m a -> STM m (Maybe a)+tryPeekTChan = Lazy.tryPeekTChan . toLazyTChan++dupTChan :: MonadSTM m => StrictTChan m a -> STM m (StrictTChan m a)+dupTChan = fmap fromLazyTChan . Lazy.dupTChan . toLazyTChan++unGetTChan :: MonadSTM m => StrictTChan m a -> a -> STM m ()+unGetTChan (StrictTChan chan) !a = Lazy.unGetTChan chan a++isEmptyTChan :: MonadSTM m => StrictTChan m a -> STM m Bool+isEmptyTChan = Lazy.isEmptyTChan . toLazyTChan++cloneTChan :: MonadSTM m => StrictTChan m a -> STM m (StrictTChan m a)+cloneTChan = fmap fromLazyTChan . Lazy.cloneTChan . toLazyTChan
+ strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TMVar.hs view
@@ -0,0 +1,109 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE ExplicitNamespaces #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeOperators #-}++-- | This module corresponds to `Control.Concurrent.STM.TMVar` in "stm" package+--+module Control.Concurrent.Class.MonadSTM.Strict.TMVar+ ( -- * StrictTMVar+ StrictTMVar+ , LazyTMVar+ , toLazyTMVar+ , fromLazyTMVar+ , castStrictTMVar+ , newTMVar+ , newEmptyTMVar+ , newTMVarIO+ , newEmptyTMVarIO+ , takeTMVar+ , tryTakeTMVar+ , putTMVar+ , tryPutTMVar+ , readTMVar+ , tryReadTMVar+ , swapTMVar+ , writeTMVar+ , isEmptyTMVar+ -- * MonadLabelledSTM+ , labelTMVar+ , labelTMVarIO+ -- * MonadTraceSTM+ , traceTMVar+ , traceTMVarIO+ ) where+++import Control.Concurrent.Class.MonadSTM.TMVar qualified as Lazy+import Control.Monad.Class.MonadSTM hiding (traceTMVar, traceTMVarIO)+++type LazyTMVar m = Lazy.TMVar m++-- | 'TMVar' that keeps its value in WHNF at all times+newtype StrictTMVar m a = StrictTMVar { toLazyTMVar :: LazyTMVar m a }++fromLazyTMVar :: LazyTMVar m a -> StrictTMVar m a+fromLazyTMVar = StrictTMVar++labelTMVar :: MonadLabelledSTM m => StrictTMVar m a -> String -> STM m ()+labelTMVar (StrictTMVar tvar) = Lazy.labelTMVar tvar++labelTMVarIO :: MonadLabelledSTM m => StrictTMVar m a -> String -> m ()+labelTMVarIO v = atomically . labelTMVar v++traceTMVar :: MonadTraceSTM m+ => proxy m+ -> StrictTMVar m a+ -> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)+ -> STM m ()+traceTMVar p (StrictTMVar var) = Lazy.traceTMVar p var++traceTMVarIO :: MonadTraceSTM m+ => StrictTMVar m a+ -> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)+ -> m ()+traceTMVarIO (StrictTMVar var) = Lazy.traceTMVarIO var++castStrictTMVar :: LazyTMVar m ~ LazyTMVar n+ => StrictTMVar m a -> StrictTMVar n a+castStrictTMVar (StrictTMVar var) = StrictTMVar var++newTMVar :: MonadSTM m => a -> STM m (StrictTMVar m a)+newTMVar !a = StrictTMVar <$> Lazy.newTMVar a++newTMVarIO :: MonadSTM m => a -> m (StrictTMVar m a)+newTMVarIO !a = StrictTMVar <$> Lazy.newTMVarIO a++newEmptyTMVar :: MonadSTM m => STM m (StrictTMVar m a)+newEmptyTMVar = StrictTMVar <$> Lazy.newEmptyTMVar++newEmptyTMVarIO :: MonadSTM m => m (StrictTMVar m a)+newEmptyTMVarIO = StrictTMVar <$> Lazy.newEmptyTMVarIO++takeTMVar :: MonadSTM m => StrictTMVar m a -> STM m a+takeTMVar (StrictTMVar tmvar) = Lazy.takeTMVar tmvar++tryTakeTMVar :: MonadSTM m => StrictTMVar m a -> STM m (Maybe a)+tryTakeTMVar (StrictTMVar tmvar) = Lazy.tryTakeTMVar tmvar++putTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m ()+putTMVar (StrictTMVar tmvar) !a = Lazy.putTMVar tmvar a++tryPutTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m Bool+tryPutTMVar (StrictTMVar tmvar) !a = Lazy.tryPutTMVar tmvar a++readTMVar :: MonadSTM m => StrictTMVar m a -> STM m a+readTMVar (StrictTMVar tmvar) = Lazy.readTMVar tmvar++tryReadTMVar :: MonadSTM m => StrictTMVar m a -> STM m (Maybe a)+tryReadTMVar (StrictTMVar tmvar) = Lazy.tryReadTMVar tmvar++swapTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m a+swapTMVar (StrictTMVar tmvar) !a = Lazy.swapTMVar tmvar a++writeTMVar :: MonadSTM m => StrictTMVar m a -> a -> STM m ()+writeTMVar (StrictTMVar tmvar) !a = Lazy.writeTMVar tmvar a++isEmptyTMVar :: MonadSTM m => StrictTMVar m a -> STM m Bool+isEmptyTMVar (StrictTMVar tmvar) = Lazy.isEmptyTMVar tmvar
+ strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TQueue.hs view
@@ -0,0 +1,98 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE ExplicitNamespaces #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE TypeOperators #-}++-- | This module corresponds to `Control.Concurrent.STM.TQueue` in "stm" package+--+module Control.Concurrent.Class.MonadSTM.Strict.TQueue+ ( -- * MonadSTM+ StrictTQueue+ , LazyTQueue+ , toLazyTQueue+ , fromLazyTQueue+ , castStrictTQueue+ , newTQueue+ , newTQueueIO+ , readTQueue+ , tryReadTQueue+ , peekTQueue+ , tryPeekTQueue+ , flushTQueue+ , writeTQueue+ , unGetTQueue+ , isEmptyTQueue+ -- * MonadLabelledSTM+ , labelTQueue+ , labelTQueueIO+ -- * MonadTraceSTM+ , traceTQueue+ , traceTQueueIO+ ) where+++import Control.Concurrent.Class.MonadSTM.TQueue qualified as Lazy+import Control.Monad.Class.MonadSTM hiding (traceTQueue, traceTQueueIO)+++type LazyTQueue m = Lazy.TQueue m++newtype StrictTQueue m a = StrictTQueue { toLazyTQueue :: LazyTQueue m a }++fromLazyTQueue :: LazyTQueue m a -> StrictTQueue m a+fromLazyTQueue = StrictTQueue++castStrictTQueue :: LazyTQueue m ~ LazyTQueue n+ => StrictTQueue m a -> StrictTQueue n a+castStrictTQueue (StrictTQueue var) = StrictTQueue var++labelTQueue :: MonadLabelledSTM m => StrictTQueue m a -> String -> STM m ()+labelTQueue (StrictTQueue queue) = Lazy.labelTQueue queue++labelTQueueIO :: MonadLabelledSTM m => StrictTQueue m a -> String -> m ()+labelTQueueIO (StrictTQueue queue) = Lazy.labelTQueueIO queue++traceTQueue :: MonadTraceSTM m+ => proxy m+ -> StrictTQueue m a+ -> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)+ -> STM m ()+traceTQueue p (StrictTQueue queue) = Lazy.traceTQueue p queue++traceTQueueIO :: MonadTraceSTM m+ => StrictTQueue m a+ -> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)+ -> m ()+traceTQueueIO (StrictTQueue queue) = Lazy.traceTQueueIO queue++newTQueue :: MonadSTM m => STM m (StrictTQueue m a)+newTQueue = StrictTQueue <$> Lazy.newTQueue++newTQueueIO :: MonadSTM m => m (StrictTQueue m a)+newTQueueIO = atomically newTQueue++readTQueue :: MonadSTM m => StrictTQueue m a -> STM m a+readTQueue = Lazy.readTQueue . toLazyTQueue++tryReadTQueue :: MonadSTM m => StrictTQueue m a -> STM m (Maybe a)+tryReadTQueue = Lazy.tryReadTQueue . toLazyTQueue++peekTQueue :: MonadSTM m => StrictTQueue m a -> STM m a+peekTQueue = Lazy.peekTQueue . toLazyTQueue++tryPeekTQueue :: MonadSTM m => StrictTQueue m a -> STM m (Maybe a)+tryPeekTQueue = Lazy.tryPeekTQueue . toLazyTQueue++flushTQueue :: MonadSTM m => StrictTQueue m a -> STM m [a]+flushTQueue = Lazy.flushTQueue . toLazyTQueue++writeTQueue :: MonadSTM m => StrictTQueue m a -> a -> STM m ()+writeTQueue (StrictTQueue tqueue) !a = Lazy.writeTQueue tqueue a++isEmptyTQueue :: MonadSTM m => StrictTQueue m a -> STM m Bool+isEmptyTQueue = Lazy.isEmptyTQueue . toLazyTQueue++unGetTQueue :: MonadSTM m => StrictTQueue m a -> a -> STM m ()+unGetTQueue (StrictTQueue queue) !a = Lazy.unGetTQueue queue a+
+ strict-stm/Control/Concurrent/Class/MonadSTM/Strict/TVar.hs view
@@ -0,0 +1,108 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}++-- | This module corresponds to `Control.Concurrent.STM.TVar` in "stm" package+--+module Control.Concurrent.Class.MonadSTM.Strict.TVar+ ( -- * StrictTVar+ StrictTVar+ , LazyTVar+ , toLazyTVar+ , fromLazyTVar+ , castStrictTVar+ , newTVar+ , newTVarIO+ , readTVar+ , readTVarIO+ , writeTVar+ , modifyTVar+ , stateTVar+ , swapTVar+ , check+ -- * MonadLabelSTM+ , labelTVar+ , labelTVarIO+ -- * MonadTraceSTM+ , traceTVar+ , traceTVarIO+ ) where++import Control.Concurrent.Class.MonadSTM.TVar qualified as Lazy+import Control.Monad.Class.MonadSTM hiding (traceTVar, traceTVarIO)++type LazyTVar m = Lazy.TVar m++newtype StrictTVar m a = StrictTVar {+ tvar :: LazyTVar m a+ }++labelTVar :: MonadLabelledSTM m => StrictTVar m a -> String -> STM m ()+labelTVar StrictTVar { tvar } = Lazy.labelTVar tvar++labelTVarIO :: MonadLabelledSTM m => StrictTVar m a -> String -> m ()+labelTVarIO v = atomically . labelTVar v++traceTVar :: MonadTraceSTM m+ => proxy m+ -> StrictTVar m a+ -> (Maybe a -> a -> InspectMonad m TraceValue)+ -> STM m ()+traceTVar p StrictTVar {tvar} = Lazy.traceTVar p tvar++traceTVarIO :: MonadTraceSTM m+ => StrictTVar m a+ -> (Maybe a -> a -> InspectMonad m TraceValue)+ -> m ()+traceTVarIO StrictTVar {tvar} = Lazy.traceTVarIO tvar++-- | Cast the monad if both use the same representation of `TVar`s.+--+-- This function is useful for monad transformers stacks if the `TVar` is used+-- in different monad stacks.+--+castStrictTVar :: LazyTVar m ~ LazyTVar n+ => StrictTVar m a -> StrictTVar n a+castStrictTVar StrictTVar {tvar} = StrictTVar {tvar}++-- | Get the underlying @TVar@+--+-- Since we obviously cannot guarantee that updates to this 'LazyTVar' will be+-- strict, this should be used with caution.+toLazyTVar :: StrictTVar m a -> LazyTVar m a+toLazyTVar StrictTVar { tvar } = tvar++fromLazyTVar :: LazyTVar m a -> StrictTVar m a+fromLazyTVar = StrictTVar++newTVar :: MonadSTM m => a -> STM m (StrictTVar m a)+newTVar !a = StrictTVar <$> Lazy.newTVar a++newTVarIO :: MonadSTM m => a -> m (StrictTVar m a)+newTVarIO !a = StrictTVar <$> Lazy.newTVarIO a++readTVar :: MonadSTM m => StrictTVar m a -> STM m a+readTVar StrictTVar { tvar } = Lazy.readTVar tvar++readTVarIO :: MonadSTM m => StrictTVar m a -> m a+readTVarIO StrictTVar { tvar } = Lazy.readTVarIO tvar++writeTVar :: MonadSTM m => StrictTVar m a -> a -> STM m ()+writeTVar v !a = Lazy.writeTVar (tvar v) a++modifyTVar :: MonadSTM m => StrictTVar m a -> (a -> a) -> STM m ()+modifyTVar v f = readTVar v >>= writeTVar v . f++stateTVar :: MonadSTM m => StrictTVar m s -> (s -> (a, s)) -> STM m a+stateTVar v f = do+ a <- readTVar v+ let (b, a') = f a+ writeTVar v a'+ return b++swapTVar :: MonadSTM m => StrictTVar m a -> a -> STM m a+swapTVar v a' = do+ a <- readTVar v+ writeTVar v a'+ return a
+ strict-stm/README.md view
@@ -0,0 +1,18 @@+# Strict Software Transaction Memory++The `io-classes:strict-stm` package provides a strict interface to software transaction+memory. It builds on top of [`io-classes:io-classes`] and thus it provides the interface+for both [`stm`] as well as [`io-sim`].++# Novel testing / space-leak elimination approach++The strict interface provides a novel way of testing/eliminating space-leaks+which might lurk in `stm` shared mutable variables. Together with the+[`nothunks`] library it was successfully used to eliminate and keep a large+system ([`cardano-node`]) space leak free.++[`cardano-node`]: https://www.github.com/input-output-hk/cardano-node+[`io-classes:io-classes`]: https://hackage.haskell.org/package/io-classes+[`io-sim`]: https://hackage.haskell.org/package/io-sim+[`nothunks`]: https://hackage.haskell.org/package/nothunks+[`stm`]: https://hackage.haskell.org/package/stm
+ test/Test/Control/Concurrent/Class/MonadMVar/Strict/WHNF.hs view
@@ -0,0 +1,123 @@+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++-- | Test whether functions on 'StrictMVar's correctly force values to WHNF+-- before they are put inside the 'StrictMVar'.+module Test.Control.Concurrent.Class.MonadMVar.Strict.WHNF+ ( prop_newMVar+ , prop_putMVar+ , prop_swapMVar+ , prop_tryPutMVar+ , prop_modifyMVar_+ , prop_modifyMVar+ , prop_modifyMVarMasked_+ , prop_modifyMVarMasked+ , (.:)+ ) where++import Control.Concurrent.Class.MonadMVar.Strict+import Control.Monad (void)+import Data.Typeable (Typeable)+import NoThunks.Class (OnlyCheckWhnf (OnlyCheckWhnf), unsafeNoThunks)+import Test.QuickCheck+import Test.QuickCheck.Monadic (PropertyM, monitor, run)++{-------------------------------------------------------------------------------+ Utilities+-------------------------------------------------------------------------------}++infixr 9 .:++(.:) :: (y -> z) -> (x0 -> x1 -> y) -> (x0 -> x1 -> z)+(.:) g f x0 x1 = g (f x0 x1)++isInWHNF :: (MonadMVar m, Typeable a) => StrictMVar m a -> PropertyM m Bool+isInWHNF v = do+ x <- run $ readMVar v+ case unsafeNoThunks (OnlyCheckWhnf x) of+ Nothing -> pure True+ Just tinfo -> monitor (counterexample $ "Not in WHNF: " ++ show tinfo)+ >> pure False++{-------------------------------------------------------------------------------+ Properties+-------------------------------------------------------------------------------}++prop_newMVar ::+ MonadMVar m+ => Int+ -> Fun Int Int+ -> PropertyM m Bool+prop_newMVar x f = do+ v <- run $ newMVar (applyFun f x)+ isInWHNF v++prop_putMVar ::+ MonadMVar m+ => Int+ -> Fun Int Int+ -> PropertyM m Bool+prop_putMVar x f = do+ v <- run newEmptyMVar+ run $ putMVar v (applyFun f x)+ isInWHNF v++prop_swapMVar ::+ MonadMVar m+ => Int+ -> Fun Int Int+ -> PropertyM m Bool+prop_swapMVar x f = do+ v <- run $ newMVar x+ void $ run $ swapMVar v (applyFun f x)+ isInWHNF v++prop_tryPutMVar ::+ MonadMVar m+ => Int+ -> Fun Int Int+ -> PropertyM m Bool+prop_tryPutMVar x f = do+ v <- run newEmptyMVar+ b <- run $ tryPutMVar v (applyFun f x)+ b' <- isInWHNF v+ pure (b && b')++prop_modifyMVar_ ::+ MonadMVar m+ => Int+ -> Fun Int Int+ -> PropertyM m Bool+prop_modifyMVar_ x f =do+ v <- run $ newMVar x+ run $ modifyMVar_ v (pure . applyFun f)+ isInWHNF v++prop_modifyMVar ::+ MonadMVar m+ => Int+ -> Fun Int (Int, Char)+ -> PropertyM m Bool+prop_modifyMVar x f =do+ v <- run $ newMVar x+ void $ run $ modifyMVar v (pure . applyFun f)+ isInWHNF v++prop_modifyMVarMasked_ ::+ MonadMVar m+ => Int+ -> Fun Int Int+ -> PropertyM m Bool+prop_modifyMVarMasked_ x f =do+ v <- run $ newMVar x+ void $ run $ modifyMVarMasked_ v (pure . applyFun f)+ isInWHNF v++prop_modifyMVarMasked ::+ MonadMVar m+ => Int+ -> Fun Int (Int, Char)+ -> PropertyM m Bool+prop_modifyMVarMasked x f =do+ v <- run $ newMVar x+ void $ run $ modifyMVarMasked v (pure . applyFun f)+ isInWHNF v