packages feed

hix-0.5.2: lib/Hix/Monad.hs

module Hix.Monad where

import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Except (ExceptT, runExceptT, throwE)
import Control.Monad.Trans.Reader (ReaderT (runReaderT))
import Path (Abs, Dir, Path)

import Hix.Data.Error (Error (BootstrapError, EnvError, GhciError, NewError), tryIO)

data Env =
  Env {
    cwd :: Path Abs Dir
  }
  deriving stock (Eq, Show, Generic)

type M a = ReaderT Env (ExceptT Error IO) a

throwM :: Error -> M a
throwM =
  lift . throwE

noteEnv :: Text -> Maybe a -> M a
noteEnv err =
  maybe (throwM (EnvError err)) pure

noteGhci :: Text -> Maybe a -> M a
noteGhci err =
  maybe (throwM (GhciError err)) pure

noteNew :: Text -> Maybe a -> M a
noteNew err =
  maybe (throwM (NewError err)) pure

noteBootstrap :: Text -> Maybe a -> M a
noteBootstrap err =
  maybe (throwM (BootstrapError err)) pure

runM :: Path Abs Dir -> M a -> IO (Either Error a)
runM root ma =
  runExceptT (runReaderT ma (Env root))

tryIOM :: IO a -> M a
tryIOM ma =
  lift (tryIO ma)