{- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. -} -- | Transformers and exceptions. module SlackBuilder.Trans ( SlackBuilderException(..) , SlackBuilderT(..) , relativeToRepository ) where import Control.Monad.Trans.Reader (ReaderT(..), asks) import Data.Text (Text) import SlackBuilder.Config import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Catch (MonadCatch(..), MonadThrow(..)) import Control.Exception (Exception(..)) import System.FilePath (()) newtype SlackBuilderException = UpdaterNotFound Text deriving Show instance Exception SlackBuilderException newtype SlackBuilderT a = SlackBuilderT { runSlackBuilderT :: ReaderT Settings IO a } relativeToRepository :: FilePath -> SlackBuilderT FilePath relativeToRepository filePath = ( filePath) <$> SlackBuilderT (asks repository) 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