mtl-unleashed 0.5 → 0.6
raw patch · 5 files changed
+137/−15 lines, 5 filesdep +transformers-compatPVP ok
version bump matches the API change (PVP)
Dependencies added: transformers-compat
API changes (from Hackage documentation)
+ Control.Lens.Readers: asks :: MonadReaders r m => (r -> a) -> m a
+ Control.Lens.Readers: ipreview :: MonadReaders s m => IndexedGetting i (First (i, a)) s a -> m (Maybe (i, a))
+ Control.Lens.Readers: iview :: MonadReaders s m => IndexedGetting i (i, a) s a -> m (i, a)
+ Control.Lens.Readers: iviews :: MonadReaders s m => IndexedGetting i r s a -> (i -> a -> r) -> m r
+ Control.Lens.Readers: preview :: MonadReaders s m => Getting (First a) s a -> m (Maybe a)
+ Control.Lens.Readers: previews :: MonadReaders s m => Getting (First r) s a -> (a -> r) -> m (Maybe r)
+ Control.Lens.Readers: review :: MonadReaders b m => AReview t b -> m t
+ Control.Lens.Readers: reviews :: MonadReaders b m => AReview t b -> (t -> r) -> m r
+ Control.Lens.Readers: view :: MonadReaders r m => Getting a r a -> m a
+ Control.Lens.Readers: views :: MonadReaders s m => LensLike' (Const r) s a -> (a -> r) -> m r
+ Control.Lens.States: (%=) :: MonadStates s m => ASetter s s a b -> (a -> b) -> m ()
+ Control.Lens.States: (.=) :: MonadStates s m => ASetter s s a b -> b -> m ()
+ Control.Lens.States: (<.=) :: MonadStates s m => ASetter s s a b -> b -> m b
+ Control.Lens.States: (<>~) :: Monoid a => ASetter s t a a -> a -> s -> t
+ Control.Lens.States: (<?=) :: MonadStates s m => ASetter s s a (Maybe b) -> b -> m b
+ Control.Lens.States: (<~) :: MonadStates s m => ASetter s s a b -> m b -> m ()
+ Control.Lens.States: (?=) :: MonadStates s m => ASetter s s a (Maybe b) -> b -> m ()
+ Control.Lens.States: get :: MonadStates s m => m s
+ Control.Lens.States: put :: MonadStates s m => s -> m ()
+ Control.Lens.States: use :: MonadStates s m => Getting a s a -> m a
+ Control.Monad.Readers: readerPoly :: MonadReaders r m => (r -> a) -> m a
Files
- Control/Lens/Readers.hs +60/−0
- Control/Lens/States.hs +60/−0
- Control/Monad/Readers.hs +2/−2
- Tests/Main.hs +11/−11
- mtl-unleashed.cabal +4/−2
+ Control/Lens/Readers.hs view
@@ -0,0 +1,60 @@+-- | Versions of the lens operators for MonadStates instead of MonadState.+module Control.Lens.Readers+ ( module Control.Monad.Readers+ , asks+ , views+ , iview+ , iviews+ , review+ , view+ , reviews+ , preview+ , ipreview+ , previews+ ) where++import Control.Lens hiding (views, iview, iviews, review, view, reviews, preview, ipreview, previews)+import Control.Monad.Readers+import Control.Monad.Writer (First(First, getFirst))+import Data.Monoid -- for base < 4.8+import Data.Profunctor.Unsafe ((#.), (.#))+import Data.Tagged (Tagged(Tagged, unTagged))++asks :: MonadReaders r m => (r -> a) -> m a+asks = readerPoly++views :: MonadReaders s m => LensLike' (Const r) s a -> (a -> r) -> m r+views l f = asks (getConst #. l (Const #. f))+{-# INLINE views #-}++iview :: MonadReaders s m => IndexedGetting i (i,a) s a -> m (i,a)+iview l = asks (getConst #. l (Indexed $ \i -> Const #. (,) i))+{-# INLINE iview #-}++iviews :: MonadReaders s m => IndexedGetting i r s a -> (i -> a -> r) -> m r+iviews l f = asks (getConst #. l (Const #. Indexed f))+{-# INLINE iviews #-}++review :: MonadReaders b m => AReview t b -> m t+review p = asks (runIdentity #. unTagged #. p .# Tagged .# Identity)+{-# INLINE review #-}++view :: MonadReaders r m => Getting a r a -> m a+view = viewPoly+{-# INLINE view #-}++reviews :: MonadReaders b m => AReview t b -> (t -> r) -> m r+reviews p tr = asks (tr . runIdentity #. unTagged #. p .# Tagged .# Identity)+{-# INLINE reviews #-}++preview :: MonadReaders s m => Getting (First a) s a -> m (Maybe a)+preview l = asks (getFirst #. foldMapOf l (First #. Just))+{-# INLINE preview #-}++ipreview :: MonadReaders s m => IndexedGetting i (First (i, a)) s a -> m (Maybe (i, a))+ipreview l = asks (getFirst #. ifoldMapOf l (\i a -> First (Just (i, a))))+{-# INLINE ipreview #-}++previews :: MonadReaders s m => Getting (First r) s a -> (a -> r) -> m (Maybe r)+previews l f = asks (getFirst . foldMapOf l (First #. Just . f))+{-# INLINE previews #-}
+ Control/Lens/States.hs view
@@ -0,0 +1,60 @@+-- | Versions of the lens operators for MonadStates instead of MonadState.+module Control.Lens.States+ ( module Control.Monad.States+ , use+ , get+ , put+ , (.=)+ , (%=)+ , (?=)+ , (<~)+ , (<.=)+ , (<?=)+ , (<>~)+ ) where++import Control.Applicative -- for base < 4.8+import Control.Lens hiding (use, (.=), (%=), (?=), (<~), (<.=), (<?=), (<>~))+import Control.Monad.States+import Data.Monoid -- for base < 4.8++use :: MonadStates s m => Getting a s a -> m a+use = usePoly++get :: MonadStates s m => m s+get = getPoly++put :: MonadStates s m => s -> m ()+put = putPoly++(.=) :: MonadStates s m => ASetter s s a b -> b -> m ()+l .= b = modifyPoly (l .~ b)+{-# INLINE (.=) #-}++(%=) :: MonadStates s m => ASetter s s a b -> (a -> b) -> m ()+l %= f = modifyPoly (l %~ f)+{-# INLINE (%=) #-}++(?=) :: MonadStates s m => ASetter s s a (Maybe b) -> b -> m ()+l ?= b = modifyPoly (l ?~ b)+{-# INLINE (?=) #-}++(<~) :: MonadStates s m => ASetter s s a b -> m b -> m ()+l <~ mb = mb >>= (l .=)+{-# INLINE (<~) #-}++(<.=) :: MonadStates s m => ASetter s s a b -> b -> m b+l <.= b = do+ l .= b+ return b+{-# INLINE (<.=) #-}++(<?=) :: MonadStates s m => ASetter s s a (Maybe b) -> b -> m b+l <?= b = do+ l ?= b+ return b+{-# INLINE (<?=) #-}++(<>~) :: Monoid a => ASetter s t a a -> a -> s -> t+l <>~ n = over l (`mappend` n)+{-# INLINE (<>~) #-}
Control/Monad/Readers.hs view
@@ -6,7 +6,7 @@ {-# LANGUAGE ScopedTypeVariables #-} module Control.Monad.Readers ( module Control.Monad.Trans.Reader- , MonadReaders(askPoly, localPoly)+ , MonadReaders(askPoly, localPoly, readerPoly) , viewPoly ) where @@ -33,7 +33,7 @@ import Control.Monad.Trans.Class (lift) -- import Control.Monad--- import Data.Monoid+import Data.Monoid class Monad m => MonadReaders r m where askPoly :: m r
Tests/Main.hs view
@@ -7,11 +7,11 @@ module Main where import Control.Applicative-import Control.Lens as Lens-import Control.Monad.Reader (ReaderT, runReader, runReaderT)-import Control.Monad.Readers as Readers+import qualified Control.Lens as Lens+import Control.Lens.Readers as Readers+import Control.Lens.States as States+import Control.Monad.Reader as Reader (ask, local, ReaderT, runReader, runReaderT, withReaderT) import Control.Monad.State (evalState, lift)-import Control.Monad.States as States import Test.Hspec hiding (runIO) import Test.Hspec.Core.Spec (SpecM) @@ -30,9 +30,9 @@ , _t :: T } -$(makeLenses ''S)-$(makeLenses ''T)-$(makeLenses ''R)+$(Lens.makeLenses ''S)+$(Lens.makeLenses ''T)+$(Lens.makeLenses ''R) runBoth action = runReader (runReaderT action (T 5 'x')) (S 2.5 True) @@ -41,13 +41,13 @@ -- Custom instances to direct us through stacked/nested reader monads - -- how to get an S from an R instance Monad m => MonadReaders S (ReaderT R m) where- askPoly = Lens.magnify s askPoly- localPoly f action = askPoly >>= \(r :: R) -> runReaderT (lift action) (set s (f (Lens.view s r)) r)+ askPoly = Lens.view s+ localPoly f action = withReaderT (Lens.over s f) action -- how to get a T from an R instance Monad m => MonadReaders T (ReaderT R m) where- askPoly = Lens.magnify t askPoly- localPoly f action = askPoly >>= \(r :: R) -> runReaderT (lift action) (set t (f (Lens.view t r)) r)+ askPoly = Lens.view t+ localPoly f action = withReaderT (Lens.over t f) action -- how to get an S from a T (it doesn't have one, we have -- to get it from m.)
mtl-unleashed.cabal view
@@ -1,5 +1,5 @@ name: mtl-unleashed-version: 0.5+version: 0.6 cabal-version: >= 1.10 build-type: Simple license: BSD3@@ -19,11 +19,13 @@ extra type signatures. library- build-depends: base < 5, lens >= 4.13, mtl, contravariant, profunctors, tagged, transformers+ build-depends: base < 5, lens >= 4.13, mtl, contravariant, profunctors, tagged, transformers, transformers-compat ghc-options: -Wall -O2 exposed-modules: Control.Monad.Readers Control.Monad.States+ Control.Lens.Readers+ Control.Lens.States default-language: Haskell2010 test-suite mtl-unleashed-tests