module Development.Hake.Tools (

  changeSuffix
, orDie
, systemE
, rawSystemE

) where

import System.Exit         (ExitCode(ExitSuccess, ExitFailure), exitWith)
import System.Cmd          (system, rawSystem)
import Control.Monad.Trans (MonadIO, liftIO)
import Data.List           (isSuffixOf)

orDie :: MonadIO m => m ExitCode -> (ExitCode -> String) -> m ()
orDie act msg = do
  ec <- act
  case ec of
    ExitSuccess   -> return ()
    ExitFailure _ -> do liftIO $ putStrLn $ msg ec
                        liftIO $ exitWith ec

changeSuffix :: String -> String -> String -> String
changeSuffix oldSfx newSfx fn
  | isSuffixOf oldSfx fn = take (length fn - length oldSfx) fn ++ newSfx
  | otherwise            = error $ "changeSuffix: " ++ oldSfx ++ " is not suffix of " ++ fn

systemE :: MonadIO m => String -> m ExitCode
systemE cmd = liftIO (putStrLn cmd) >> liftIO (system cmd)

rawSystemE :: MonadIO m => [ String ] -> m ExitCode
rawSystemE []  = error "rawSystemE: command not exist"
rawSystemE cmd = liftIO (putStrLn $ unwords cmd) >> liftIO (rawSystem (head cmd) (tail cmd))