module Snap.Internal.Instances where
import Control.Applicative
import Control.Monad.CatchIO ()
import Control.Monad.Cont
import Control.Monad.Error
import Control.Monad.List
import Control.Monad.RWS.Strict hiding (pass)
import qualified Control.Monad.RWS.Lazy as LRWS
import Control.Monad.Reader
import Control.Monad.State.Strict
import qualified Control.Monad.State.Lazy as LState
import Control.Monad.Writer.Strict hiding (pass)
import qualified Control.Monad.Writer.Lazy as LWriter
#if !MIN_VERSION_base(4,6,0)
import Prelude hiding (catch)
#endif
import Snap.Internal.Types
instance MonadPlus m => MonadPlus (ContT c m) where
mzero = lift mzero
m `mplus` n = ContT $ \ f -> runContT m f `mplus` runContT n f
instance MonadPlus m => Alternative (ContT c m) where
empty = mzero
(<|>) = mplus
instance MonadSnap m => MonadSnap (ContT c m) where
liftSnap = lift . liftSnap
instance (MonadSnap m, Error e) => MonadSnap (ErrorT e m) where
liftSnap = lift . liftSnap
instance MonadSnap m => MonadSnap (ListT m) where
liftSnap = lift . liftSnap
instance (MonadSnap m, Monoid w) => MonadSnap (RWST r w s m) where
liftSnap = lift . liftSnap
instance (MonadSnap m, Monoid w) => MonadSnap (LRWS.RWST r w s m) where
liftSnap = lift . liftSnap
instance MonadSnap m => MonadSnap (ReaderT r m) where
liftSnap = lift . liftSnap
instance MonadSnap m => MonadSnap (StateT s m) where
liftSnap = lift . liftSnap
instance MonadSnap m => MonadSnap (LState.StateT s m) where
liftSnap = lift . liftSnap
instance (MonadSnap m, Monoid w) => MonadSnap (WriterT w m) where
liftSnap = lift . liftSnap
instance (MonadSnap m, Monoid w) => MonadSnap (LWriter.WriterT w m) where
liftSnap = lift . liftSnap