module SlackBuilder.Trans ( SlackBuilderT(..) ) where import Control.Monad.Trans.Reader (ReaderT(..)) import SlackBuilder.Config import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Catch (MonadCatch(..), MonadThrow(..)) newtype SlackBuilderT a = SlackBuilderT { runSlackBuilderT :: ReaderT Settings IO a } instance Functor SlackBuilderT where fmap f (SlackBuilderT slackBuilderT) = SlackBuilderT $ f <$> slackBuilderT instance Applicative SlackBuilderT where pure = SlackBuilderT . pure (SlackBuilderT f) <*> (SlackBuilderT x) = SlackBuilderT $ f <*> x instance Monad SlackBuilderT where return = pure (SlackBuilderT x) >>= f = SlackBuilderT $ x >>= runSlackBuilderT . f instance MonadIO SlackBuilderT where liftIO = SlackBuilderT . liftIO instance MonadThrow SlackBuilderT where throwM = SlackBuilderT . throwM instance MonadCatch SlackBuilderT where catch (SlackBuilderT action) handler = SlackBuilderT $ catch action $ runSlackBuilderT . handler