ref-tf 0.3.0.2 → 0.3.0.3
raw patch · 3 files changed
+130/−68 lines, 3 filesdep ~transformerssetup-changed
Dependency ranges changed: transformers
Files
- Control/Monad/Ref.hs +125/−62
- Setup.hs +0/−1
- ref-tf.cabal +5/−5
Control/Monad/Ref.hs view
@@ -1,15 +1,17 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeFamilies #-}+{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}+ -- | -- Module : Control.Monad.Ref -- Copyright : (c) Harvard University 2006-2011--- (c) Geoffrey Mainland 2011-2012+-- (c) Geoffrey Mainland 2011-2014 -- License : BSD-style--- Maintainer : mainland@eecs.harvard.edu+-- Maintainer : Geoffrey Mainland <mainland@cs.drexel.edu> -- -- Stability : experimental -- Portability : non-portable -{-# LANGUAGE TypeFamilies #-}- module Control.Monad.Ref ( MonadRef(..), MonadAtomicRef(..)@@ -23,6 +25,9 @@ import Control.Monad.ST (ST) import Control.Monad.Trans.Cont (ContT) import Control.Monad.Trans.Error (ErrorT, Error)+#if MIN_VERSION_transformers(0,4,0)+import Control.Monad.Trans.Except (ExceptT)+#endif /* MIN_VERSION_transformers(0,4,0) */ import Control.Monad.Trans.Identity (IdentityT) import Control.Monad.Trans.List (ListT) import Control.Monad.Trans.Maybe (MaybeT)@@ -33,6 +38,10 @@ import Control.Monad.Trans.Writer.Strict as Strict (WriterT) import Control.Monad.Trans.Class (lift) import Data.IORef (IORef,+#if MIN_VERSION_base(4,6,0)+ atomicModifyIORef',+ modifyIORef',+#endif /* MIN_VERSION_base(4,6,0) */ atomicModifyIORef, modifyIORef, newIORef,@@ -40,6 +49,9 @@ writeIORef) import Data.Monoid (Monoid) import Data.STRef (STRef,+#if MIN_VERSION_base(4,6,0)+ modifySTRef',+#endif /* MIN_VERSION_base(4,6,0) */ modifySTRef, newSTRef, readSTRef,@@ -61,26 +73,43 @@ -- |Mutate the contents of a reference modifyRef :: Ref m a -> (a -> a) -> m () modifyRef r f = readRef r >>= writeRef r . f+ -- |Strict version of 'modifyRef'+ modifyRef' :: Ref m a -> (a -> a) -> m ()+ modifyRef' r f = readRef r >>= \x -> let x' = f x in x' `seq` writeRef r x' class (MonadRef m) => MonadAtomicRef m where -- |Atomically mutate the contents of a reference atomicModifyRef :: Ref m a -> (a -> (a, b)) -> m b+ -- |Strict version of atomicModifyRef. This forces both the value stored in+ -- the reference as well as the value returned.+ atomicModifyRef' :: Ref m a -> (a -> (a, b)) -> m b+ atomicModifyRef' r f = do+ b <- atomicModifyRef r+ (\x -> let (a, b) = f x+ in (a, a `seq` b))+ b `seq` return b instance MonadRef (ST s) where type Ref (ST s) = STRef s - newRef = newSTRef- readRef = readSTRef- writeRef = writeSTRef- modifyRef = modifySTRef+ newRef = newSTRef+ readRef = readSTRef+ writeRef = writeSTRef+ modifyRef = modifySTRef+#if MIN_VERSION_base(4,6,0)+ modifyRef' = modifySTRef'+#endif /* MIN_VERSION_base(4,6,0) */ instance MonadRef IO where type Ref IO = IORef - newRef = newIORef- readRef = readIORef- writeRef = writeIORef- modifyRef = modifyIORef+ newRef = newIORef+ readRef = readIORef+ writeRef = writeIORef+ modifyRef = modifyIORef+#if MIN_VERSION_base(4,6,0)+ modifyRef' = modifyIORef'+#endif /* MIN_VERSION_base(4,6,0) */ instance MonadRef STM where type Ref STM = TVar@@ -92,85 +121,109 @@ instance MonadRef m => MonadRef (ContT r m) where type Ref (ContT r m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance (Error e, MonadRef m) => MonadRef (ErrorT e m) where type Ref (ErrorT e m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f +#if MIN_VERSION_transformers(0,4,0)+instance (MonadRef m) => MonadRef (ExceptT e m) where+ type Ref (ExceptT e m) = Ref m++ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f+#endif /* MIN_VERSION_transformers(0,4,0) */+ instance MonadRef m => MonadRef (IdentityT m) where type Ref (IdentityT m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance MonadRef m => MonadRef (ListT m) where type Ref (ListT m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance MonadRef m => MonadRef (MaybeT m) where type Ref (MaybeT m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance MonadRef m => MonadRef (ReaderT r m) where type Ref (ReaderT r m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance MonadRef m => MonadRef (Lazy.StateT s m) where type Ref (Lazy.StateT s m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance MonadRef m => MonadRef (Strict.StateT s m) where type Ref (Strict.StateT s m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance (Monoid w, MonadRef m) => MonadRef (Lazy.WriterT w m) where type Ref (Lazy.WriterT w m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance (Monoid w, MonadRef m) => MonadRef (Strict.WriterT w m) where type Ref (Strict.WriterT w m) = Ref m - newRef r = lift $ newRef r- readRef r = lift $ readRef r- writeRef r x = lift $ writeRef r x- modifyRef r f = lift $ modifyRef r f+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f+ modifyRef' r f = lift $ modifyRef' r f instance MonadAtomicRef IO where atomicModifyRef = atomicModifyIORef+#if MIN_VERSION_base(4,6,0)+ atomicModifyRef' = atomicModifyIORef'+#endif /* MIN_VERSION_base(4,6,0) */ instance MonadAtomicRef STM where atomicModifyRef r f = do x <- readRef r@@ -179,31 +232,41 @@ return y instance MonadAtomicRef m => MonadAtomicRef (ContT r m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance (Error e, MonadAtomicRef m) => MonadAtomicRef (ErrorT e m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance MonadAtomicRef m => MonadAtomicRef (IdentityT m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance MonadAtomicRef m => MonadAtomicRef (ListT m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance MonadAtomicRef m => MonadAtomicRef (MaybeT m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance MonadAtomicRef m => MonadAtomicRef (ReaderT r m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance MonadAtomicRef m => MonadAtomicRef (Lazy.StateT s m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance MonadAtomicRef m => MonadAtomicRef (Strict.StateT s m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance (Monoid w, MonadAtomicRef m) => MonadAtomicRef (Lazy.WriterT w m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f instance (Monoid w, MonadAtomicRef m) => MonadAtomicRef (Strict.WriterT w m) where- atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef r f = lift $ atomicModifyRef r f+ atomicModifyRef' r f = lift $ atomicModifyRef' r f
Setup.hs view
@@ -1,3 +1,2 @@ import Distribution.Simple- main = defaultMain
ref-tf.cabal view
@@ -1,14 +1,14 @@ name: ref-tf-version: 0.3.0.2+version: 0.3.0.3 cabal-version: >= 1.6 license: BSD3 license-file: LICENSE copyright: (c) 2006-2011 Harvard University- (c) 2011-2012 Geoffrey Mainland-author: Geoffrey Mainland <mainland@eecs.harvard.edu>+ (c) 2011-2014 Geoffrey Mainland+author: Geoffrey Mainland <mainland@cs.drexel.edu> maintainer: mainland@eecs.harvard.edu stability: alpha-homepage: http://www.eecs.harvard.edu/~mainland/+homepage: http://www.cs.drexel.edu/~mainland/ category: Control synopsis: A type class for monads with references using type families. description: Contains a 'MonadRef' type class that abstracts over the@@ -24,7 +24,7 @@ build-depends: base >= 4 && < 5, stm >= 2.1 && < 2.5,- transformers >= 0.2 && < 0.4+ transformers >= 0.2 && < 0.5 source-repository head type: git