{-# OPTIONS_GHC -Wno-orphans #-}
{-# OPTIONS_GHC -Wno-deprecations #-}
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
  stToIO :: forall a. ST (PrimState (ContT r m)) a -> ContT r m a
stToIO = m a -> ContT r m a
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ContT r m a)
-> (ST (PrimState m) a -> m a) -> ST (PrimState m) a -> ContT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST (PrimState m) a -> m a
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO
  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 s. (forall a. ST s a -> m a) -> b) -> b
forall b. (forall s. (forall a. ST s a -> m a) -> b) -> b
forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST ((forall s. (forall a. ST s a -> m a) -> b) -> b)
-> (forall s. (forall a. ST s a -> m a) -> b) -> b
forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> (forall a. ST s a -> ContT r m a) -> b
forall s. (forall a. ST s a -> ContT r m a) -> b
f (m a -> ContT r m a
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ContT r m a) -> (ST s a -> m a) -> ST s a -> ContT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST s a -> m a
forall a. ST s a -> m a
g)

instance MonadST m => MonadST (ExceptT e m) where
  stToIO :: forall a. ST (PrimState (ExceptT e m)) a -> ExceptT e m a
stToIO = m a -> ExceptT e m a
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ExceptT e m a)
-> (ST (PrimState m) a -> m a)
-> ST (PrimState m) a
-> ExceptT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST (PrimState m) a -> m a
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO
  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 s. (forall a. ST s a -> m a) -> b) -> b
forall b. (forall s. (forall a. ST s a -> m a) -> b) -> b
forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST ((forall s. (forall a. ST s a -> m a) -> b) -> b)
-> (forall s. (forall a. ST s a -> m a) -> b) -> b
forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> (forall a. ST s a -> ExceptT e m a) -> b
forall s. (forall a. ST s a -> ExceptT e m a) -> b
f (m a -> ExceptT e m a
forall (m :: * -> *) a. Monad m => m a -> ExceptT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ExceptT e m a)
-> (ST s a -> m a) -> ST s a -> ExceptT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST s a -> m a
forall a. ST s a -> m a
g)

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

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

instance MonadST m => MonadST (Lazy.StateT s m) where
  stToIO :: forall a. ST (PrimState (StateT s m)) a -> StateT s m a
stToIO = m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a)
-> (ST (PrimState m) a -> m a)
-> ST (PrimState m) a
-> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST (PrimState m) a -> m a
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO
  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 s. (forall a. ST s a -> m a) -> b) -> b
forall b. (forall s. (forall a. ST s a -> m a) -> b) -> b
forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST ((forall s. (forall a. ST s a -> m a) -> b) -> b)
-> (forall s. (forall a. ST s a -> m a) -> b) -> b
forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> (forall a. ST s a -> StateT s m a) -> b
forall s. (forall a. ST s a -> StateT s m a) -> b
f (m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a) -> (ST s a -> m a) -> ST s a -> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST s a -> m a
forall a. ST s a -> m a
g)

instance MonadST m => MonadST (Strict.StateT s m) where
  stToIO :: forall a. ST (PrimState (StateT s m)) a -> StateT s m a
stToIO = m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a)
-> (ST (PrimState m) a -> m a)
-> ST (PrimState m) a
-> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST (PrimState m) a -> m a
forall a. ST (PrimState m) a -> m a
forall (m :: * -> *) a. MonadST m => ST (PrimState m) a -> m a
stToIO
  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 s. (forall a. ST s a -> m a) -> b) -> b
forall b. (forall s. (forall a. ST s a -> m a) -> b) -> b
forall (m :: * -> *) b.
MonadST m =>
(forall s. (forall a. ST s a -> m a) -> b) -> b
withLiftST ((forall s. (forall a. ST s a -> m a) -> b) -> b)
-> (forall s. (forall a. ST s a -> m a) -> b) -> b
forall a b. (a -> b) -> a -> b
$ \forall a. ST s a -> m a
g -> (forall a. ST s a -> StateT s m a) -> b
forall s. (forall a. ST s a -> StateT s m a) -> b
f (m a -> StateT s m a
forall (m :: * -> *) a. Monad m => m a -> StateT s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> StateT s m a) -> (ST s a -> m a) -> ST s a -> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ST s a -> m a
forall a. ST s a -> m a
g)

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

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