module SlackBuilder.Trans ( SlackBuilderT(..) ) where import Control.Monad.Trans.Reader (ReaderT(..)) import SlackBuilder.Config import Control.Monad.IO.Class (MonadIO(..)) 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