module Control.Error.Script (
Script,
runScript,
scriptIO
) where
import Control.Exception (try, SomeException)
import Control.Monad (liftM)
import Control.Monad.IO.Class (MonadIO(liftIO))
import Control.Monad.Trans.Except (ExceptT(ExceptT), runExceptT)
import Control.Error.Util (errLn)
import Data.EitherR (fmapL)
import System.Environment (getProgName)
import System.Exit (exitFailure)
import Control.Monad.Trans.Class (lift)
import System.IO (stderr)
type Script = ExceptT String IO
runScript :: Script a -> IO a
runScript s = do
e <- runExceptT s
case e of
Left e -> do
errLn =<< liftM (++ ": " ++ e) getProgName
exitFailure
Right a -> return a
scriptIO :: (MonadIO m) => IO a -> ExceptT String m a
scriptIO = ExceptT
. liftIO
. liftM (fmapL show)
. (try :: IO a -> IO (Either SomeException a))