module Control.Monad.Prompt.Class (
MonadPrompt(..)
, prompt'
, prompts'
) where
import Control.Monad.Trans.Class
import Control.Monad.Trans.Error
import Control.Monad.Trans.Except
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader
import Prelude.Compat
import qualified Control.Monad.Trans.RWS.Lazy as RWSL
import qualified Control.Monad.Trans.RWS.Strict as RWSS
import qualified Control.Monad.Trans.State.Lazy as SL
import qualified Control.Monad.Trans.State.Strict as SS
import qualified Control.Monad.Trans.Writer.Lazy as WL
import qualified Control.Monad.Trans.Writer.Strict as WS
class Applicative m => MonadPrompt a b m | m -> a b where
prompt :: a
-> m b
prompt = prompts id
prompts :: (b -> c)
-> a
-> m c
prompts f = fmap f . prompt
#if MIN_VERSION_base(4,7,0)
#endif
prompt' :: MonadPrompt a b m => a -> m b
prompt' x = x `seq` prompt x
prompts' :: MonadPrompt a b m => (b -> c) -> a -> m c
prompts' f x = x `seq` prompts f x
instance (Monad m, MonadPrompt a b m) => MonadPrompt a b (ReaderT r m) where
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m) => MonadPrompt a b (ExceptT e m) where
prompt = lift . prompt
prompts f = lift . prompts f
#if MIN_VERSION_transformers(0,5,0)
instance (Monad m, MonadPrompt a b m) => MonadPrompt a b (ErrorT e m) where
#else
instance (Error e, Monad m, MonadPrompt a b m) => MonadPrompt a b (ErrorT e m) where
#endif
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m) => MonadPrompt a b (SS.StateT s m) where
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m) => MonadPrompt a b (SL.StateT s m) where
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m, Monoid w) => MonadPrompt a b (WS.WriterT w m) where
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m, Monoid w) => MonadPrompt a b (WL.WriterT w m) where
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m, Monoid w) => MonadPrompt a b (RWSS.RWST r w s m) where
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m, Monoid w) => MonadPrompt a b (RWSL.RWST r w s m) where
prompt = lift . prompt
prompts f = lift . prompts f
instance (Monad m, MonadPrompt a b m) => MonadPrompt a b (MaybeT m) where
prompt = lift . prompt
prompts f = lift . prompts f