hbs2/hbs2-core/lib/HBS2/OrDie.hs

25 lines
660 B
Haskell

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 ExitCode where
type instance OrDieResult ExitCode = ()
orDie mv err = mv >>= \case
ExitSuccess -> pure ()
ExitFailure{} -> liftIO $ die err