fraxl-0.1.0.0: src/Control/Monad/Fraxl/Class.hs
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeOperators #-}
-- Not actually undecidable.
-- @MonadFraxl f (Fraxl r m)@ is not undecidable,
-- but @f ∈ r@ doesn't satisfy the functional dependency @Fraxl r m -> f@.
{-# LANGUAGE UndecidableInstances #-}
module Control.Monad.Fraxl.Class
(
-- * Fraxl Monads
MonadFraxl(..)
) where
import Control.Applicative.Fraxl.Free
import Control.Monad.Free.Class
import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont
import Control.Monad.Trans.Except
import Control.Monad.Trans.Fraxl
import Control.Monad.Trans.Identity
import Control.Monad.Trans.List
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader
import qualified Control.Monad.Trans.RWS.Lazy as Lazy
import qualified Control.Monad.Trans.RWS.Strict as Strict
import qualified Control.Monad.Trans.State.Lazy as Lazy
import qualified Control.Monad.Trans.State.Strict as Strict
import qualified Control.Monad.Trans.Writer.Lazy as Lazy
import qualified Control.Monad.Trans.Writer.Strict as Strict
import Data.Vinyl.Optic.Plain.Class
import qualified Data.Vinyl.Prelude.CoRec as CR
import Data.Vinyl.Types
-- | Class for Fraxl-capable monads.
class Monad m => MonadFraxl f m where
-- | 'dataFetch' is used to make a request of type 'f'.
dataFetch :: f a -> m a
default dataFetch :: (MonadTrans t, MonadFraxl f m) => f a -> t m a
dataFetch = lift . dataFetch
instance (Monad m, f ∈ r) => MonadFraxl f (Fraxl r m) where
dataFetch = liftF . liftAp . Union . FunctorCoRec . CR.lift . Flap
instance Monad m => MonadFraxl f (FreerT f m) where
dataFetch = liftF . liftAp
instance MonadFraxl f m => MonadFraxl f (ContT r m) where
instance MonadFraxl f m => MonadFraxl f (ExceptT e m) where
instance MonadFraxl f m => MonadFraxl f (IdentityT m) where
instance MonadFraxl f m => MonadFraxl f (ListT m) where
instance MonadFraxl f m => MonadFraxl f (MaybeT m) where
instance MonadFraxl f m => MonadFraxl f (ReaderT e m) where
instance (MonadFraxl f m, Monoid w) => MonadFraxl f (Lazy.RWST r w s m) where
instance (MonadFraxl f m, Monoid w) => MonadFraxl f (Strict.RWST r w s m) where
instance MonadFraxl f m => MonadFraxl f (Lazy.StateT s m) where
instance MonadFraxl f m => MonadFraxl f (Strict.StateT s m) where
instance (MonadFraxl f m, Monoid w) => MonadFraxl f (Lazy.WriterT w m) where
instance (MonadFraxl f m, Monoid w) => MonadFraxl f (Strict.WriterT w m) where