data-accessor-transformers 0.2 → 0.2.1
raw patch · 2 files changed
+79/−1 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Accessor.Monad.Trans.RWS: (%:) :: (Monad m, Monoid w) => T s a -> (a -> a) -> RWST r w s m ()
+ Data.Accessor.Monad.Trans.RWS: (%=) :: (Monad m, Monoid w) => T s a -> a -> RWST r w s m ()
+ Data.Accessor.Monad.Trans.RWS: get :: (Monad m, Monoid w) => T s a -> RWST r w s m a
+ Data.Accessor.Monad.Trans.RWS: getAndModify :: (Monad m, Monoid w) => T s a -> (a -> a) -> RWST r w s m a
+ Data.Accessor.Monad.Trans.RWS: lift :: (Monad m, Monoid w) => T s1 s0 -> RWS r w s0 a -> RWST r w s1 m a
+ Data.Accessor.Monad.Trans.RWS: liftT :: (Monad m, Monoid w) => T s1 s0 -> RWST r w s0 m a -> RWST r w s1 m a
+ Data.Accessor.Monad.Trans.RWS: modify :: (Monad m, Monoid w) => T s a -> (a -> a) -> RWST r w s m ()
+ Data.Accessor.Monad.Trans.RWS: modifyAndGet :: (Monad m, Monoid w) => T s a -> (a -> a) -> RWST r w s m a
+ Data.Accessor.Monad.Trans.RWS: set :: (Monad m, Monoid w) => T s a -> a -> RWST r w s m ()
Files
data-accessor-transformers.cabal view
@@ -1,5 +1,5 @@ Name: data-accessor-transformers-Version: 0.2+Version: 0.2.1 License: BSD3 License-File: LICENSE Author: Henning Thielemann <haskell@henning-thielemann.de>@@ -16,4 +16,5 @@ Tested-With: GHC==6.8.2 Hs-Source-Dirs: src Exposed-Modules:+ Data.Accessor.Monad.Trans.RWS Data.Accessor.Monad.Trans.State
+ src/Data/Accessor/Monad/Trans/RWS.hs view
@@ -0,0 +1,77 @@+{- | Access helper functions in a Reader-Writer-State monad -}+module Data.Accessor.Monad.Trans.RWS where++import qualified Data.Accessor.Basic as Accessor+import qualified Control.Monad.Trans.RWS as RWS+import qualified Control.Monad.Trans as Trans+import Control.Monad.Trans.RWS (RWS, runRWS, RWST(runRWST), )+import Control.Monad.Trans (MonadTrans)+import Data.Monoid (Monoid)+++-- * accessors in the form of actions in the RWS monad++set :: (Monad m, Monoid w) => Accessor.T s a -> a -> RWST r w s m ()+set f x = RWS.modify (Accessor.set f x)++get :: (Monad m, Monoid w) => Accessor.T s a -> RWST r w s m a+get f = RWS.gets (Accessor.get f)++modify :: (Monad m, Monoid w) => Accessor.T s a -> (a -> a) -> RWST r w s m ()+modify f g = RWS.modify (Accessor.modify f g)++{- |+Modify a record element and return its old value.+-}+getAndModify :: (Monad m, Monoid w) => Accessor.T s a -> (a -> a) -> RWST r w s m a+getAndModify f g =+ do x <- get f+ modify f g+ return x++{- |+Modify a record element and return its new value.+-}+modifyAndGet :: (Monad m, Monoid w) => Accessor.T s a -> (a -> a) -> RWST r w s m a+modifyAndGet f g =+ do modify f g+ get f++++infix 1 %=, %:++{- |+Infix variant of 'set'.+-}+(%=) :: (Monad m, Monoid w) => Accessor.T s a -> a -> RWST r w s m ()+(%=) = set++{- |+Infix variant of 'modify'.+-}+(%:) :: (Monad m, Monoid w) => Accessor.T s a -> (a -> a) -> RWST r w s m ()+(%:) = modify++++-- * lift a RWS monadic accessor to an accessor of a parent record++lift :: (Monad m, Monoid w) => Accessor.T s1 s0 -> RWS r w s0 a -> RWST r w s1 m a+lift f m =+ do r <- RWS.ask+ s0 <- get f+ let (a,s1,w) = runRWS m r s0+ set f s1+ RWS.tell w+ return a++liftT :: (Monad m, Monoid w) =>+ Accessor.T s1 s0 -> RWST r w s0 m a -> RWST r w s1 m a+liftT f m =+ do r <- RWS.ask+ s0 <- get f+ (a,s1,w) <- Trans.lift $ runRWST m r s0+ set f s1+ RWS.tell w+ return a