module HBS2.OrDie where import Data.Kind import Control.Monad.IO.Class import System.Exit class OrDie m a where type family OrDieResult a :: Type orDie :: m a -> String -> m (OrDieResult a) orDieM :: (Monad m, OrDie m a) => a -> String -> m (OrDieResult a) orDieM a msg = pure a `orDie` msg instance MonadIO m => OrDie m (Maybe a) where type instance OrDieResult (Maybe a) = a orDie mv err = mv >>= \case Nothing -> liftIO $ die err Just x -> pure x instance MonadIO m => OrDie m (Either a b) where type instance OrDieResult (Either a b) = b orDie mv err = mv >>= \case Left{} -> liftIO $ die err Right x -> pure x instance MonadIO m => OrDie m ExitCode where type instance OrDieResult ExitCode = () orDie mv err = mv >>= \case ExitSuccess -> pure () ExitFailure{} -> liftIO $ die err