packages feed

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 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