io-classes 1.3.1.0 → 1.4.0.0
raw patch · 25 files changed
+172/−118 lines, 25 filesdep ~base
Dependency ranges changed: base
Files
- CHANGELOG.md +5/−1
- NOTICE +1/−1
- README.md +32/−0
- io-classes.cabal +9/−5
- src/Control/Concurrent/Class/MonadMVar.hs +5/−5
- src/Control/Concurrent/Class/MonadSTM.hs +7/−7
- src/Control/Concurrent/Class/MonadSTM/TArray.hs +1/−1
- src/Control/Concurrent/Class/MonadSTM/TBQueue.hs +1/−1
- src/Control/Concurrent/Class/MonadSTM/TChan.hs +1/−1
- src/Control/Concurrent/Class/MonadSTM/TMVar.hs +1/−1
- src/Control/Concurrent/Class/MonadSTM/TQueue.hs +2/−2
- src/Control/Concurrent/Class/MonadSTM/TSem.hs +1/−1
- src/Control/Concurrent/Class/MonadSTM/TVar.hs +1/−1
- src/Control/Monad/Class/MonadAsync.hs +21/−17
- src/Control/Monad/Class/MonadEventlog.hs +3/−5
- src/Control/Monad/Class/MonadFork.hs +10/−5
- src/Control/Monad/Class/MonadMVar.hs +0/−3
- src/Control/Monad/Class/MonadST.hs +2/−2
- src/Control/Monad/Class/MonadSTM.hs +9/−9
- src/Control/Monad/Class/MonadSTM/Internal.hs +27/−27
- src/Control/Monad/Class/MonadSay.hs +2/−2
- src/Control/Monad/Class/MonadTest.hs +2/−2
- src/Control/Monad/Class/MonadThrow.hs +10/−6
- src/Control/Monad/Class/MonadTime.hs +9/−6
- src/Control/Monad/Class/MonadTimer.hs +10/−7
CHANGELOG.md view
@@ -1,10 +1,14 @@ # Revsion history of io-classes -## next release+## 1.4.0.0 ### Breaking changes +* Removed deprecated module `Control.Monad.Class.MonadVar`.+ ### Non-breaking changes++* Fixed some module haddock typos. ## 1.3.1.0
NOTICE view
@@ -1,4 +1,4 @@-Copyright 2019-2023 Input Output Global Inc (IOG)+Copyright 2019-2024 Input Output Global Inc (IOG) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
README.md view
@@ -80,7 +80,38 @@ * [MonadST]: provides a way to lift `ST`-computations. * [MonadSay]: dummy debugging interface +## Differences from `base`, `async`, or `exceptions` packages +### Major differences++* `getMonotonicTime` returns `Time` (a newtype wrapper around `DiffTime`)+* `Deadlock` exceptions are not thrown to the main thread (see+ [ref][io-deadlock]), so they cannot be caught. This was a design decision,+ which allows to catch all deadlocks which otherwise could be captured by+ a `catch`.++### Minor differences++Some of the types have more general kind signatures, e.g.++```+type Async :: (Type -> Type) -> Type -> Type+```++The first type of kind `Type -> Type` describes the monad which could be+instantiated to `IO`, `IOSim` or some other monad stacks built with monad+transformers. The same applies to many other types, e.g. `TVar`, `TMVar`.++The following types although similar to the originals are not the same as the+ones that come from `base`, `async`, or `exceptions` packages:++* `Handler` (origin: `base`)+* `MaskingState` (origin: `base`)+* `Concurrently` (origin: `async`)+* `ExceptionInLinkedThread` (origin: `async`): `io-class`es version does not+ store `Async`+* `ExitCase` (origin: `exceptions`)+ ## Debuging & Insepction We provide quite extended debugging & inspection API. This proved to be@@ -117,6 +148,7 @@ [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 [Debug.Trace]: https://hackage.haskell.org/package/base/docs/Debug-Trace.html
io-classes.cabal view
@@ -1,14 +1,18 @@ cabal-version: 3.0 name: io-classes-version: 1.3.1.0+version: 1.4.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', 'async',- 'stm', 'exceptions' & 'time' packages.+ [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-2023 Input Output Global Inc (IOG)+copyright: 2019-2024 Input Output Global Inc (IOG) author: Alexander Vieth, Duncan Coutts, Marcin Szamotulski, Thomas Winant maintainer: Duncan Coutts duncan@well-typed.com, Marcin Szamotulski coot@coot.me category: Control@@ -56,7 +60,6 @@ Control.Monad.Class.MonadAsync Control.Monad.Class.MonadEventlog Control.Monad.Class.MonadFork- Control.Monad.Class.MonadMVar Control.Monad.Class.MonadSay Control.Monad.Class.MonadST Control.Monad.Class.MonadSTM@@ -66,6 +69,7 @@ Control.Monad.Class.MonadTimer Control.Monad.Class.MonadTest default-language: Haskell2010+ default-extensions: ImportQualifiedPost other-extensions: CPP DataKinds DefaultSignatures
src/Control/Concurrent/Class/MonadMVar.hs view
@@ -8,13 +8,13 @@ , MonadInspectMVar (..) ) where -import qualified Control.Concurrent.MVar as IO-import Control.Monad.Class.MonadThrow+import Control.Concurrent.MVar qualified as IO+import Control.Monad.Class.MonadThrow -import Control.Monad.Reader (ReaderT (..))-import Control.Monad.Trans (lift)+import Control.Monad.Reader (ReaderT (..))+import Control.Monad.Trans (lift) -import Data.Kind (Type)+import Data.Kind (Type) class Monad m => MonadMVar m where
src/Control/Concurrent/Class/MonadSTM.hs view
@@ -4,11 +4,11 @@ (module STM) where -import Control.Monad.Class.MonadSTM as STM-import Control.Concurrent.Class.MonadSTM.TVar as STM-import Control.Concurrent.Class.MonadSTM.TMVar as STM-import Control.Concurrent.Class.MonadSTM.TChan as STM-import Control.Concurrent.Class.MonadSTM.TQueue as STM-import Control.Concurrent.Class.MonadSTM.TBQueue as STM-import Control.Concurrent.Class.MonadSTM.TArray as STM+import Control.Monad.Class.MonadSTM as STM+import Control.Concurrent.Class.MonadSTM.TVar as STM+import Control.Concurrent.Class.MonadSTM.TMVar as STM+import Control.Concurrent.Class.MonadSTM.TChan as STM+import Control.Concurrent.Class.MonadSTM.TQueue as STM+import Control.Concurrent.Class.MonadSTM.TBQueue as STM+import Control.Concurrent.Class.MonadSTM.TArray as STM
src/Control/Concurrent/Class/MonadSTM/TArray.hs view
@@ -4,4 +4,4 @@ -- module Control.Concurrent.Class.MonadSTM.TArray (type TArray) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal
src/Control/Concurrent/Class/MonadSTM/TBQueue.hs view
@@ -25,4 +25,4 @@ , traceTBQueueIO ) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal
src/Control/Concurrent/Class/MonadSTM/TChan.hs view
@@ -23,4 +23,4 @@ , isEmptyTChan ) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal
src/Control/Concurrent/Class/MonadSTM/TMVar.hs view
@@ -25,4 +25,4 @@ , traceTMVarIO ) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal
src/Control/Concurrent/Class/MonadSTM/TQueue.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE ExplicitNamespaces #-} --- | This module corresponds to `Control.Concurrnet.STM.TVar` in "stm" package+-- | This module corresponds to `Control.Concurrent.STM.TQueue` in "stm" package -- module Control.Concurrent.Class.MonadSTM.TQueue ( -- * MonadSTM@@ -23,4 +23,4 @@ , traceTQueueIO ) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal
src/Control/Concurrent/Class/MonadSTM/TSem.hs view
@@ -17,4 +17,4 @@ , traceTSemIO ) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal
src/Control/Concurrent/Class/MonadSTM/TVar.hs view
@@ -23,4 +23,4 @@ , traceTVarIO ) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal
src/Control/Monad/Class/MonadAsync.hs view
@@ -10,6 +10,10 @@ {-# LANGUAGE TypeFamilyDependencies #-} -- MonadAsync's ReaderT instance is undecidable. {-# LANGUAGE UndecidableInstances #-}++-- | <https://hackage.haskell.org/package/async async> API compatible with both+-- 'IO' and <https://hackage.haskell.org/package/io-sim IOSim>.+-- module Control.Monad.Class.MonadAsync ( MonadAsync (..) , AsyncCancelled (..)@@ -27,30 +31,30 @@ , Concurrently (..) ) where -import Prelude hiding (read)+import Prelude hiding (read) #if MIN_VERSION_base(4,18,0)-import Control.Applicative (Alternative (..))+import Control.Applicative (Alternative (..)) #else-import Control.Applicative (Alternative (..), liftA2)+import Control.Applicative (Alternative (..), liftA2) #endif-import Control.Monad (forever)-import Control.Monad.Class.MonadFork-import Control.Monad.Class.MonadSTM-import Control.Monad.Class.MonadThrow-import Control.Monad.Class.MonadTimer+import Control.Monad (forever)+import Control.Monad.Class.MonadFork+import Control.Monad.Class.MonadSTM+import Control.Monad.Class.MonadThrow+import Control.Monad.Class.MonadTimer -import Control.Monad.Reader (ReaderT (..))-import Control.Monad.Trans (lift)+import Control.Monad.Reader (ReaderT (..))+import Control.Monad.Trans (lift) -import Control.Concurrent.Async (AsyncCancelled (..))-import qualified Control.Concurrent.Async as Async-import qualified Control.Exception as E+import Control.Concurrent.Async (AsyncCancelled (..))+import Control.Concurrent.Async qualified as Async+import Control.Exception qualified as E -import Data.Bifunctor (first)-import Data.Foldable (fold)-import Data.Functor (void)-import Data.Kind (Type)+import Data.Bifunctor (first)+import Data.Foldable (fold)+import Data.Functor (void)+import Data.Kind (Type) class ( MonadSTM m , MonadThread m
src/Control/Monad/Class/MonadEventlog.hs view
@@ -1,10 +1,8 @@-module Control.Monad.Class.MonadEventlog- ( MonadEventlog (..)- ) where+module Control.Monad.Class.MonadEventlog (MonadEventlog (..)) where -import Control.Monad.Reader+import Control.Monad.Reader -import qualified Debug.Trace as IO (traceEventIO, traceMarkerIO)+import Debug.Trace qualified as IO (traceEventIO, traceMarkerIO) class Monad m => MonadEventlog m where
src/Control/Monad/Class/MonadFork.hs view
@@ -3,17 +3,22 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} +-- | A generalisation of+-- <https://hackage.haskell.org/package/base/docs/Control-Concurrent.html Control.Concurrent>+-- API to both 'IO' and <https://hackage.haskell.org/package/io-sim IOSim>.+-- module Control.Monad.Class.MonadFork ( MonadThread (..) , labelThisThread , MonadFork (..) ) where -import qualified Control.Concurrent as IO-import Control.Exception (AsyncException (ThreadKilled), Exception, SomeException)-import Control.Monad.Reader (ReaderT (..), lift)-import Data.Kind (Type)-import qualified GHC.Conc.Sync as IO (labelThread)+import Control.Concurrent qualified as IO+import Control.Exception (AsyncException (ThreadKilled), Exception,+ SomeException)+import Control.Monad.Reader (ReaderT (..), lift)+import Data.Kind (Type)+import GHC.Conc.Sync qualified as IO (labelThread) class (Monad m, Eq (ThreadId m),
− src/Control/Monad/Class/MonadMVar.hs
@@ -1,3 +0,0 @@-module Control.Monad.Class.MonadMVar {-# DEPRECATED "Use Control.Concurrent.Class.MonadMVar" #-} (module X) where--import Control.Concurrent.Class.MonadMVar as X
src/Control/Monad/Class/MonadST.hs view
@@ -1,9 +1,9 @@ {-# LANGUAGE RankNTypes #-} module Control.Monad.Class.MonadST (MonadST (..)) where -import Control.Monad.Reader+import Control.Monad.Reader -import Control.Monad.ST (ST, stToIO)+import Control.Monad.ST (ST, stToIO) -- | This class is for abstracting over 'stToIO' which allows running 'ST'
src/Control/Monad/Class/MonadSTM.hs view
@@ -1,15 +1,15 @@ -- | This module corresponds to "Control.Monad.STM" in "stm" package ---{-# LANGUAGE DataKinds #-}-{-# LANGUAGE DerivingStrategies #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-} -- undecidable instances needed for 'WrappedSTM' instances of 'MonadThrow' and -- 'MonadCatch' type classes.-{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE UndecidableInstances #-} module Control.Monad.Class.MonadSTM ( MonadSTM (STM, atomically, retry, orElse, check) , throwSTM@@ -22,7 +22,7 @@ , MonadInspectSTM (..) ) where -import Control.Monad.Class.MonadSTM.Internal+import Control.Monad.Class.MonadSTM.Internal -- $non-standard-extensions --
src/Control/Monad/Class/MonadSTM/Internal.hs view
@@ -48,7 +48,7 @@ , isEmptyTMVarDefault , labelTMVarDefault , traceTMVarDefault- -- ** Default 'TBQueue' implementation+ -- ** Default 'TQueue' implementation , TQueueDefault (..) , newTQueueDefault , writeTQueueDefault@@ -99,35 +99,35 @@ , labelTChanDefault ) where -import Prelude hiding (read)+import Prelude hiding (read) -import qualified Control.Concurrent.STM.TArray as STM-import qualified Control.Concurrent.STM.TBQueue as STM-import qualified Control.Concurrent.STM.TChan as STM-import qualified Control.Concurrent.STM.TMVar as STM-import qualified Control.Concurrent.STM.TQueue as STM-import qualified Control.Concurrent.STM.TSem as STM-import qualified Control.Concurrent.STM.TVar as STM-import Control.Monad (unless, when)-import qualified Control.Monad.STM as STM+import Control.Concurrent.STM.TArray qualified as STM+import Control.Concurrent.STM.TBQueue qualified as STM+import Control.Concurrent.STM.TChan qualified as STM+import Control.Concurrent.STM.TMVar qualified as STM+import Control.Concurrent.STM.TQueue qualified as STM+import Control.Concurrent.STM.TSem qualified as STM+import Control.Concurrent.STM.TVar qualified as STM+import Control.Monad (unless, when)+import Control.Monad.STM qualified as STM -import Control.Monad.Reader (ReaderT (..))-import Control.Monad.Trans (lift)+import Control.Monad.Reader (ReaderT (..))+import Control.Monad.Trans (lift) -import qualified Control.Monad.Class.MonadThrow as MonadThrow+import Control.Monad.Class.MonadThrow qualified as MonadThrow -import Control.Exception-import Data.Array (Array, bounds)-import qualified Data.Array as Array-import Data.Array.Base (IArray (numElements), MArray (..),- arrEleBottom, listArray, unsafeAt)-import Data.Foldable (traverse_)-import Data.Ix (Ix, rangeSize)-import Data.Kind (Type)-import Data.Proxy (Proxy (..))-import Data.Typeable (Typeable)-import GHC.Stack-import Numeric.Natural (Natural)+import Control.Exception+import Data.Array (Array, bounds)+import Data.Array qualified as Array+import Data.Array.Base (IArray (numElements), MArray (..), arrEleBottom,+ listArray, unsafeAt)+import Data.Foldable (traverse_)+import Data.Ix (Ix, rangeSize)+import Data.Kind (Type)+import Data.Proxy (Proxy (..))+import Data.Typeable (Typeable)+import GHC.Stack+import Numeric.Natural (Natural) -- $default-implementations@@ -436,7 +436,7 @@ -- This is supported by 'IOSim' (and 'IOSimPOR'); 'IO' has a trivial instance. -- -- The simplest example is:- -- + -- -- > -- > traceTVar (Proxy @m) tvar (\_ -> TraceString . show) -- >
src/Control/Monad/Class/MonadSay.hs view
@@ -1,7 +1,7 @@ module Control.Monad.Class.MonadSay where -import Control.Monad.Reader-import qualified Data.ByteString.Char8 as BSC+import Control.Monad.Reader+import Data.ByteString.Char8 qualified as BSC class Monad m => MonadSay m where say :: String -> m ()
src/Control/Monad/Class/MonadTest.hs view
@@ -1,10 +1,10 @@ module Control.Monad.Class.MonadTest (MonadTest (..)) where -import Control.Monad.Reader+import Control.Monad.Reader -- | A helper monad for /IOSimPOR/. class Monad m => MonadTest m where- -- | mark a thread for schedule exploration. All threads that are forked by+ -- | Mark a thread for schedule exploration. All threads that are forked by -- it are also included in the exploration. -- exploreRaces :: m ()
src/Control/Monad/Class/MonadThrow.hs view
@@ -7,6 +7,10 @@ {-# LANGUAGE TupleSections #-} {-# LANGUAGE TypeFamilies #-} +-- | A generalisation of+-- <https://hackage.haskell.org/package/base/docs/Control-Exception.html Control.Exception>+-- API to both 'IO' and <https://hackage.haskell.org/package/io-sim IOSim>.+-- module Control.Monad.Class.MonadThrow ( MonadThrow (..) , MonadCatch (..)@@ -21,14 +25,14 @@ , catches ) where -import Control.Exception (Exception (..), MaskingState, SomeException)-import qualified Control.Exception as IO-import Control.Monad (liftM)+import Control.Exception (Exception (..), MaskingState, SomeException)+import Control.Exception qualified as IO+import Control.Monad (liftM) -import Control.Monad.Reader (ReaderT (..), runReaderT, lift)+import Control.Monad.Reader (ReaderT (..), lift, runReaderT) -import Control.Monad.STM (STM)-import qualified Control.Monad.STM as STM+import Control.Monad.STM (STM)+import Control.Monad.STM qualified as STM -- | Throwing exceptions, and resource handling in the presence of exceptions. --
src/Control/Monad/Class/MonadTime.hs view
@@ -1,5 +1,9 @@ {-# LANGUAGE DeriveGeneric #-} +-- | <https://hackage.haskell.org/package/time time> and+-- <https://hackage.haskell.org/package/base base> time API compatible with both+-- 'IO' and <https://hackage.haskell.org/package/io-sim IOSim>.+-- module Control.Monad.Class.MonadTime ( MonadTime (..) , MonadMonotonicTimeNSec (..)@@ -10,13 +14,12 @@ , NominalDiffTime ) where -import Control.Monad.Reader+import Control.Monad.Reader -import Data.Time.Clock (NominalDiffTime, UTCTime,- addUTCTime, diffUTCTime)-import qualified Data.Time.Clock as Time-import Data.Word (Word64)-import qualified GHC.Clock as IO (getMonotonicTimeNSec)+import Data.Time.Clock (NominalDiffTime, UTCTime, addUTCTime, diffUTCTime)+import Data.Time.Clock qualified as Time+import Data.Word (Word64)+import GHC.Clock qualified as IO (getMonotonicTimeNSec) class Monad m => MonadMonotonicTimeNSec m where
src/Control/Monad/Class/MonadTimer.hs view
@@ -4,20 +4,23 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} --- | Provides classes to handle delays and timeouts.+-- | Provides classes to handle delays and timeouts which generalised+-- <https://hackage.haskell.org/package/base base> API to both 'IO' and+-- <https://hackage.haskell.org/package/io-sim IOSim>.+-- module Control.Monad.Class.MonadTimer ( MonadDelay (..) , MonadTimer (..) ) where -import qualified Control.Concurrent as IO-import Control.Concurrent.Class.MonadSTM-import qualified Control.Concurrent.STM.TVar as STM+import Control.Concurrent qualified as IO+import Control.Concurrent.Class.MonadSTM+import Control.Concurrent.STM.TVar qualified as STM -import Control.Monad.Reader (ReaderT (..))-import Control.Monad.Trans (lift)+import Control.Monad.Reader (ReaderT (..))+import Control.Monad.Trans (lift) -import qualified System.Timeout as IO+import System.Timeout qualified as IO -- | A typeclass to delay current thread. class Monad m => MonadDelay m where