{-|
Module      : Omnifmt.Directory
Description : System directory utilities.

Copyright   : (c) Henry J. Wylde, 2015
License     : BSD3
Maintainer  : public@hjwylde.com

System directory utilities.
-}

module Omnifmt.Directory (
    -- * Changing directories
    withCurrentDirectory,
) where

import Control.Monad.Catch  (MonadMask, bracket)
import Control.Monad.Except

import System.Directory.Extra hiding (withCurrentDirectory)

-- | @withCurrentDirectory dir action@ performs @action@ with the current directory set to @dir@.
--   The current directory is reset back to what it was afterwards.
withCurrentDirectory :: (MonadIO m, MonadMask m) => FilePath -> m a -> m a
withCurrentDirectory dir action = bracket (liftIO getCurrentDirectory) (liftIO . setCurrentDirectory)
    $ \_ -> liftIO (setCurrentDirectory dir) >> action