concurrency 1.2.1.2 → 1.2.2.0
raw patch · 5 files changed
+148/−8 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Control.Monad.Conc.Class: data IsConc m a
+ Control.Monad.Conc.Class: fromIsConc :: MonadConc m => IsConc m a -> m a
+ Control.Monad.Conc.Class: instance Control.Monad.Catch.MonadCatch m => Control.Monad.Catch.MonadCatch (Control.Monad.Conc.Class.IsConc m)
+ Control.Monad.Conc.Class: instance Control.Monad.Catch.MonadMask m => Control.Monad.Catch.MonadMask (Control.Monad.Conc.Class.IsConc m)
+ Control.Monad.Conc.Class: instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (Control.Monad.Conc.Class.IsConc m)
+ Control.Monad.Conc.Class: instance Control.Monad.Conc.Class.MonadConc m => Control.Monad.Conc.Class.MonadConc (Control.Monad.Conc.Class.IsConc m)
+ Control.Monad.Conc.Class: instance GHC.Base.Applicative m => GHC.Base.Applicative (Control.Monad.Conc.Class.IsConc m)
+ Control.Monad.Conc.Class: instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.Conc.Class.IsConc m)
+ Control.Monad.Conc.Class: instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.Conc.Class.IsConc m)
+ Control.Monad.Conc.Class: toIsConc :: MonadConc m => m a -> IsConc m a
+ Control.Monad.STM.Class: data IsSTM m a
+ Control.Monad.STM.Class: fromIsSTM :: MonadSTM m => IsSTM m a -> m a
+ Control.Monad.STM.Class: instance Control.Monad.Catch.MonadCatch m => Control.Monad.Catch.MonadCatch (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: instance Control.Monad.STM.Class.MonadSTM m => Control.Monad.STM.Class.MonadSTM (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: instance GHC.Base.Alternative m => GHC.Base.Alternative (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: instance GHC.Base.Applicative m => GHC.Base.Applicative (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Control.Monad.STM.Class.IsSTM m)
+ Control.Monad.STM.Class: toIsSTM :: MonadSTM m => m a -> IsSTM m a
Files
- CHANGELOG.markdown +27/−0
- Control/Concurrent/Classy/Async.hs +1/−1
- Control/Monad/Conc/Class.hs +79/−4
- Control/Monad/STM/Class.hs +39/−1
- concurrency.cabal +2/−2
CHANGELOG.markdown view
@@ -7,6 +7,33 @@ *de facto* standard Haskell versioning scheme. +1.2.2.0+-------++- **Date** 2017-11-05+- **Git tag** [concurrency-1.2.2.0][]+- **Hackage** https://hackage.haskell.org/package/concurrency-1.2.2.0++### Control.Monad.Conc.Class++- A new `IsConc` type (and `toIsConc`, `fromIsConc` functions), where a value of type `IsConc m a`+ can only be constructed if `m` has a `MonadConc` instance. Its `STM` type is `IsSTM (STM m)`.+ (#144)++- The provided transformer instances now use the `modifyCRefCAS_` of the underlying monad, rather+ than the default definition in terms of `modifyCRefCAS`.++### Control.Monad.STM.Class++- A new `IsSTM` type (and `toIsSTM`, `fromIsSTM` functions), where a value of type `IsSTM m a` can+ only be constructed if `m` has a `MonadSTM` instance. (#144)++[concurrency-1.2.2.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.2.2.0+++---------------------------------------------------------------------------------------------------++ 1.2.1.2 -------
Control/Concurrent/Classy/Async.hs view
@@ -198,7 +198,7 @@ -- -- @since 1.2.1.0 asyncOnN :: MonadConc m => String -> Int -> m a -> m (Async m a)-asyncOnN name = asyncUsing . (forkOnN name)+asyncOnN name = asyncUsing . forkOnN name -- | Like 'async' but using 'forkWithUnmask' internally. --
Control/Monad/Conc/Class.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -60,6 +61,11 @@ , cas , peekTicket + -- * Utilities for type shenanigans+ , IsConc+ , toIsConc+ , fromIsConc+ -- * Utilities for instance writers , liftedF , liftedFork@@ -71,7 +77,8 @@ import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow) import qualified Control.Monad.Catch as Ca-import Control.Monad.STM.Class (MonadSTM, TVar, readTVar)+import Control.Monad.STM.Class (IsSTM, MonadSTM, TVar, fromIsSTM,+ readTVar) import Control.Monad.Trans.Control (MonadTransControl, StT, liftWith) import Data.Proxy (Proxy(..)) @@ -304,9 +311,9 @@ readMVar :: MVar m a -> m a -- | Attempt to read a value from a @MVar@ non-blockingly, returning- -- a 'Just' (and emptying the @MVar@) if there is something there,- -- otherwise returning 'Nothing'. As with 'readMVar', this does not- -- \"remove\" the value.+ -- a 'Just' if there is something there, otherwise returning+ -- 'Nothing'. As with 'readMVar', this does not \"remove\" the+ -- value. -- -- @since 1.1.0.0 tryReadMVar :: MVar m a -> m (Maybe a)@@ -658,6 +665,73 @@ IO.labelThread tid n -------------------------------------------------------------------------------+-- Type shenanigans++-- | A value of type @IsConc m a@ can only be constructed if @m@ has a+-- @MonadConc@ instance.+--+-- @since 1.2.2.0+newtype IsConc m a = IsConc { unIsConc :: m a }+ deriving (Functor, Applicative, Monad, MonadThrow, MonadCatch, MonadMask)++-- | Wrap an @m a@ value inside an @IsConc@ if @m@ has a @MonadConc@+-- instance.+--+-- @since 1.2.2.0+toIsConc :: MonadConc m => m a -> IsConc m a+toIsConc = IsConc++-- | Unwrap an @IsConc@ value.+--+-- @since 1.2.2.0+fromIsConc :: MonadConc m => IsConc m a -> m a+fromIsConc = unIsConc++instance MonadConc m => MonadConc (IsConc m) where+ type STM (IsConc m) = IsSTM (STM m)+ type MVar (IsConc m) = MVar m+ type CRef (IsConc m) = CRef m+ type Ticket (IsConc m) = Ticket m+ type ThreadId (IsConc m) = ThreadId m+++ fork ma = toIsConc (fork $ unIsConc ma)+ forkOn i ma = toIsConc (forkOn i $ unIsConc ma)++ forkWithUnmask ma = toIsConc (forkWithUnmask (\umask -> unIsConc $ ma (\mx -> toIsConc (umask $ unIsConc mx))))+ forkWithUnmaskN n ma = toIsConc (forkWithUnmaskN n (\umask -> unIsConc $ ma (\mx -> toIsConc (umask $ unIsConc mx))))+ forkOnWithUnmask i ma = toIsConc (forkOnWithUnmask i (\umask -> unIsConc $ ma (\mx -> toIsConc (umask $ unIsConc mx))))+ forkOnWithUnmaskN n i ma = toIsConc (forkOnWithUnmaskN n i (\umask -> unIsConc $ ma (\mx -> toIsConc (umask $ unIsConc mx))))++ getNumCapabilities = toIsConc getNumCapabilities+ setNumCapabilities = toIsConc . setNumCapabilities+ myThreadId = toIsConc myThreadId+ yield = toIsConc yield+ threadDelay = toIsConc . threadDelay+ throwTo t = toIsConc . throwTo t+ newEmptyMVar = toIsConc newEmptyMVar+ newEmptyMVarN = toIsConc . newEmptyMVarN+ readMVar = toIsConc . readMVar+ tryReadMVar = toIsConc . tryReadMVar+ putMVar v = toIsConc . putMVar v+ tryPutMVar v = toIsConc . tryPutMVar v+ takeMVar = toIsConc . takeMVar+ tryTakeMVar = toIsConc . tryTakeMVar+ newCRef = toIsConc . newCRef+ newCRefN n = toIsConc . newCRefN n+ readCRef = toIsConc . readCRef+ atomicModifyCRef r = toIsConc . atomicModifyCRef r+ writeCRef r = toIsConc . writeCRef r+ atomicWriteCRef r = toIsConc . atomicWriteCRef r+ readForCAS = toIsConc . readForCAS+ peekTicket' _ = peekTicket' (Proxy :: Proxy m)+ casCRef r t = toIsConc . casCRef r t+ modifyCRefCAS r = toIsConc . modifyCRefCAS r+ modifyCRefCAS_ r = toIsConc . modifyCRefCAS_ r+ atomically = toIsConc . atomically . fromIsSTM+ readTVarConc = toIsConc . readTVarConc++------------------------------------------------------------------------------- -- Transformer instances #define INSTANCE(T,C,F) \@@ -700,6 +774,7 @@ peekTicket' _ = peekTicket' (Proxy :: Proxy m) ; \ casCRef r t = lift . casCRef r t ; \ modifyCRefCAS r = lift . modifyCRefCAS r ; \+ modifyCRefCAS_ r = lift . modifyCRefCAS_ r ; \ atomically = lift . atomically ; \ readTVarConc = lift . readTVarConc }
Control/Monad/STM/Class.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeFamilies #-} @@ -28,8 +29,14 @@ , orElse , throwSTM , catchSTM- ) where + -- * Utilities for type shenanigans+ , IsSTM+ , toIsSTM+ , fromIsSTM+) where++import Control.Applicative (Alternative(..)) import Control.Exception (Exception) import Control.Monad (MonadPlus(..), unless) import Control.Monad.Reader (ReaderT)@@ -144,6 +151,37 @@ newTVar = STM.newTVar readTVar = STM.readTVar writeTVar = STM.writeTVar++-------------------------------------------------------------------------------+-- Type shenanigans++-- | A value of type @IsSTM m a@ can only be constructed if @m@ has a+-- @MonadSTM@ instance.+--+-- @since 1.2.2.0+newtype IsSTM m a = IsSTM { unIsSTM :: m a }+ deriving (Functor, Applicative, Alternative, Monad, MonadPlus, Ca.MonadThrow, Ca.MonadCatch)++-- | Wrap an @m a@ value inside an @IsSTM@ if @m@ has a @MonadSTM@+-- instance.+--+-- @since 1.2.2.0+toIsSTM :: MonadSTM m => m a -> IsSTM m a+toIsSTM = IsSTM++-- | Unwrap an @IsSTM@ value.+--+-- @since 1.2.2.0+fromIsSTM :: MonadSTM m => IsSTM m a -> m a+fromIsSTM = unIsSTM++instance MonadSTM m => MonadSTM (IsSTM m) where+ type TVar (IsSTM m) = TVar m++ newTVar = toIsSTM . newTVar+ newTVarN n = toIsSTM . newTVarN n+ readTVar = toIsSTM . readTVar+ writeTVar v = toIsSTM . writeTVar v ------------------------------------------------------------------------------- -- Transformer instances
concurrency.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: concurrency-version: 1.2.1.2+version: 1.2.2.0 synopsis: Typeclasses, functions, and data types for concurrency and STM. description:@@ -32,7 +32,7 @@ source-repository this type: git location: https://github.com/barrucadu/dejafu.git- tag: concurrency-1.2.1.2+ tag: concurrency-1.2.2.0 library exposed-modules: Control.Monad.Conc.Class