ref-fd 0.3.0.3 → 0.3.0.4
raw patch · 4 files changed
+132/−74 lines, 4 filesdep ~transformerssetup-changedPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: transformers
API changes (from Hackage documentation)
+ Control.Monad.Ref: atomicModifyRef' :: MonadAtomicRef r m => r a -> (a -> (a, b)) -> m b
+ Control.Monad.Ref: modifyRef' :: MonadRef r m => r a -> (a -> a) -> m ()
- Control.Monad.Ref: class MonadRef r m => MonadAtomicRef r m | m -> r
+ Control.Monad.Ref: class MonadRef r m => MonadAtomicRef r m | m -> r where atomicModifyRef' r f = do { b <- atomicModifyRef r (\ x -> let (a, b) = f x in (a, a `seq` b)); b `seq` return b }
- Control.Monad.Ref: class Monad m => MonadRef r m | m -> r where modifyRef r f = readRef r >>= writeRef r . f
+ Control.Monad.Ref: class Monad m => MonadRef r m | m -> r where modifyRef r f = readRef r >>= writeRef r . f modifyRef' r f = readRef r >>= \ x -> let x' = f x in x' `seq` writeRef r x'
Files
- Control/Monad/Ref.hs +126/−67
- LICENSE +1/−1
- Setup.hs +0/−1
- ref-fd.cabal +5/−5
Control/Monad/Ref.hs view
@@ -1,20 +1,20 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}+{-# 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 FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE UndecidableInstances #-}- module Control.Monad.Ref ( MonadRef(..), MonadAtomicRef(..)@@ -28,6 +28,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)@@ -38,6 +41,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,@@ -45,6 +52,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,@@ -64,22 +74,39 @@ -- |Mutate the contents of a reference modifyRef :: r a -> (a -> a) -> m () modifyRef r f = readRef r >>= writeRef r . f+ -- |Strict version of 'modifyRef'+ modifyRef' :: r a -> (a -> a) -> m ()+ modifyRef' r f = readRef r >>= \x -> let x' = f x in x' `seq` writeRef r x' class (MonadRef r m) => MonadAtomicRef r m | m -> r where -- |Atomically mutate the contents of a reference atomicModifyRef :: r 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' :: r 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 (STRef s) (ST s) where- 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 IORef IO where- 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 TVar STM where newRef = newTVar@@ -87,67 +114,89 @@ writeRef = writeTVar instance MonadRef r m => MonadRef r (ContT r' m) where- 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 r m) => MonadRef r (ErrorT e m) where- 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 r m) => MonadRef r (ExceptT e m) where+ 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 r m => MonadRef r (IdentityT m) where- 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 r m => MonadRef r (ListT m) where- 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 r m => MonadRef r (MaybeT m) where- 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 r m => MonadRef r (ReaderT r' m) where- 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 r m => MonadRef r (Lazy.StateT s m) where- 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 r m => MonadRef r (Strict.StateT s m) where- 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 r m) => MonadRef r (Lazy.WriterT w m) where- 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 r m) => MonadRef r (Strict.WriterT w m) where- 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 IORef IO where atomicModifyRef = atomicModifyIORef+#if MIN_VERSION_base(4,6,0)+ atomicModifyRef' = atomicModifyIORef'+#endif /* MIN_VERSION_base(4,6,0) */ instance MonadAtomicRef TVar STM where atomicModifyRef r f = do x <- readRef r@@ -156,31 +205,41 @@ return y instance MonadAtomicRef r m => MonadAtomicRef r (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 r m) => MonadAtomicRef r (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 r m => MonadAtomicRef r (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 r m => MonadAtomicRef r (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 r m => MonadAtomicRef r (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 r m => MonadAtomicRef r (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 r m => MonadAtomicRef r (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 r m => MonadAtomicRef r (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 r m) => MonadAtomicRef r (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 r m) => MonadAtomicRef r (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
LICENSE view
@@ -25,7 +25,7 @@ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Copyright (c) 2011-2012, Geoffrey Mainland+Copyright (c) 2011-2014, Geoffrey Mainland All rights reserved. Redistribution and use in source and binary forms, with or without modification,
Setup.hs view
@@ -1,3 +1,2 @@ import Distribution.Simple- main = defaultMain
ref-fd.cabal view
@@ -1,14 +1,14 @@ name: ref-fd-version: 0.3.0.3+version: 0.3.0.4 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 functional dependencies.@@ -25,7 +25,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