module Language.Haskell.Modules.Util.Temp
( withTempDirectory
) where
import qualified Control.Exception as IO (catch)
import Control.Exception.Lifted as IOT (bracket)
import Control.Monad.Trans (liftIO, MonadIO)
import Control.Monad.Trans.Control (MonadBaseControl)
import System.Directory (removeDirectoryRecursive)
import qualified System.IO.Temp as Temp (createTempDirectory)
withTempDirectory :: (MonadIO m, MonadBaseControl IO m) =>
FilePath
-> String
-> (FilePath -> m a)
-> m a
withTempDirectory targetDir template =
IOT.bracket
(liftIO $ Temp.createTempDirectory targetDir template)
(liftIO . ignoringIOErrors . removeDirectoryRecursive)
ignoringIOErrors :: IO () -> IO ()
ignoringIOErrors ioe = ioe `IO.catch` (\e -> const (return ()) (e :: IOError))