-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Generalization of MonadReader and ReaderT using hset
--   
--   Generalization of MonadReader and ReaderT using hset
@package hreader
@version 1.1.0

module Control.Monad.HReader.Class

-- | Monad which is a reader of HSet (or just can construct it).
class (Monad m, Applicative m) => MonadHReader m where type MHRElements m :: [*] where {
    type family MHRElements m :: [*];
}
askHSet :: MonadHReader m => m (HSet (MHRElements m))
hlocal :: MonadHReader m => (HSet (MHRElements m) -> HSet (MHRElements m)) -> m a -> m a

-- | Easy generate constraint like <b>(HGettable (MHRElements m) Int,
--   HGettable (MHRElements m) Bool)</b> from type list <b>[Int, Bool]</b>.
--   Usable to reuse type lists for constraints and concrete HSet.

-- | Ask arbitrary element of hset inside HReader
hask :: (MonadHReader m, HGettable (MHRElements m) e) => m e

-- | Ask arbitrary labeled element of hset in HReader
haskTagged :: (MonadHReader m, HGettable (MHRElements m) (Tagged tag e)) => proxy tag -> m e
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Cont.ContT r m)
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Identity.IdentityT m)
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Reader.ReaderT r m)
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.List.ListT m)
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Maybe.MaybeT m)
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Except.ExceptT e m)
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.State.Lazy.StateT s m)
instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.State.Strict.StateT s m)
instance (Control.Monad.HReader.Class.MonadHReader m, GHC.Base.Monoid w) => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Writer.Lazy.WriterT w m)
instance (Control.Monad.HReader.Class.MonadHReader m, GHC.Base.Monoid w) => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Writer.Strict.WriterT w m)
instance (Control.Monad.HReader.Class.MonadHReader m, GHC.Base.Monoid w) => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
instance (Control.Monad.HReader.Class.MonadHReader m, GHC.Base.Monoid w) => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.RWS.Strict.RWST r w s m)

module Control.Monad.HReader

-- | Monad transformer which is like <a>ReaderT</a> but for <a>HSet</a>
--   only
newtype HReaderT els m a
HReaderT :: ReaderT (HSet els) m a -> HReaderT els m a
[unHReaderT] :: HReaderT els m a -> ReaderT (HSet els) m a
runHReaderT :: HSet els -> HReaderT els m a -> m a

-- | Run a local reader with a subset of HSet elements.
subHSetHReaderT :: (Monad m, Applicative m, SubHSettable els subels) => HReaderT subels m a -> HReaderT els m a

-- | Convenient variant of <a>subHSetHReaderT</a> with proxy type to make
--   it posible to run nested HReaderT in place without complex type
--   declarations, e.g.
--   
--   <pre>
--   narrowHReaderT (Proxy :: Proxy '[String, Int]) $ do
--     doThingsWithString
--     doThingsWithInt
--     doThingsWithOtherStuff -- &lt; this will not compile
--   </pre>
narrowHReaderT :: (Monad m, Applicative m, SubHSettable els subels) => proxy subels -> HReaderT subels m a -> HReaderT els m a
instance GHC.Generics.Generic (Control.Monad.HReader.HReaderT els m a)
instance Control.Monad.Catch.MonadMask m => Control.Monad.Catch.MonadMask (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Catch.MonadCatch m => Control.Monad.Catch.MonadCatch (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.Monad.HReader.HReaderT els m)
instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.HReader.HReaderT els m)
instance GHC.Base.Applicative m => GHC.Base.Applicative (Control.Monad.HReader.HReaderT els m)
instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Morph.MFunctor (Control.Monad.HReader.HReaderT els)
instance Control.Monad.Morph.MMonad (Control.Monad.HReader.HReaderT els)
instance Control.Monad.Trans.Class.MonadTrans (Control.Monad.HReader.HReaderT els)
instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Control.Monad.HReader.HReaderT els m)
instance (GHC.Base.Monad m, GHC.Base.Applicative m) => Control.Monad.HReader.Class.MonadHReader (Control.Monad.HReader.HReaderT els m)
instance Control.Monad.Trans.Control.MonadTransControl (Control.Monad.HReader.HReaderT els)
instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.HReader.HReaderT els m)
