{-# OPTIONS_GHC -Wno-orphans #-}
module Control.Monad.Class.MonadST.Trans () where

import           Control.Monad.Cont (ContT)
import           Control.Monad.Except (ExceptT)
import qualified Control.Monad.RWS.Lazy as Lazy
import qualified Control.Monad.RWS.Strict as Strict
import qualified Control.Monad.State.Lazy as Lazy
import qualified Control.Monad.State.Strict as Strict
import           Control.Monad.Trans (lift)
import qualified Control.Monad.Writer.Lazy as Lazy
import qualified Control.Monad.Writer.Strict as Strict

import           Control.Monad.Class.MonadST


instance MonadST m => MonadST (ContT r m) where
  withLiftST :: forall b. (forall s. (forall a. ST s a -> ContT r m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> ContT r m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> ContT r m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g)

instance MonadST m => MonadST (ExceptT e m) where
  withLiftST :: forall b. (forall s. (forall a. ST s a -> ExceptT e m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> ExceptT e m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> ExceptT e m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g)

instance (Monoid w, MonadST m) => MonadST (Lazy.RWST r w s m) where
  withLiftST :: forall b.
(forall s. (forall a. ST s a -> RWST r w s m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> RWST r w s m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> RWST r w s m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g)

instance (Monoid w, MonadST m) => MonadST (Strict.RWST r w s m) where
  withLiftST :: forall b.
(forall s. (forall a. ST s a -> RWST r w s m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> RWST r w s m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> RWST r w s m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g)

instance MonadST m => MonadST (Lazy.StateT s m) where
  withLiftST :: forall b. (forall s. (forall a. ST s a -> StateT s m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> StateT s m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> StateT s m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g)

instance MonadST m => MonadST (Strict.StateT s m) where
  withLiftST :: forall b. (forall s. (forall a. ST s a -> StateT s m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> StateT s m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> StateT s m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g)

instance (Monoid w, MonadST m) => MonadST (Lazy.WriterT w m) where
   withLiftST :: forall b. (forall s. (forall a. ST s a -> WriterT w m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> WriterT w m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> WriterT w m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g) 

instance (Monoid w, MonadST m) => MonadST (Strict.WriterT w m) where
  withLiftST :: forall b. (forall s. (forall a. ST s a -> WriterT w m a) -> b) -> b
withLiftST forall s. (forall a. ST s a -> WriterT w m a) -> b
f = forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> forall s. (forall a. ST s a -> WriterT w m a) -> b
f (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST s a -> m a
g)