content: module Distribution.Dev.Utilities
      ( makeAbsolute
      , makeAbsoluteToCurrentDirectory
      , ensureAbsolute
      ) where
  
  import System.Directory ( getCurrentDirectory )
  import System.FilePath ( (</>), isAbsolute, isRelative )
  
  -- | Given a path, returns that path unmodified if it is absolute,
  -- otherwise it is made absolute relative to the current directory.
  ensureAbsolute :: FilePath -> IO FilePath
  ensureAbsolute path | isAbsolute path = return path
                      | otherwise       = makeAbsoluteToCurrentDirectory path
  
  -- | Makes a relative path into an absolute path, rooted in the
  -- current directory.  Throws an error if path is not relative.
  makeAbsoluteToCurrentDirectory :: FilePath -> IO FilePath
  makeAbsoluteToCurrentDirectory path = do cwd <- getCurrentDirectory
                                           case makeAbsolute cwd path of
                                             Left  m -> error m
                                             Right p -> return p
  
  -- | Creates an absolute file path from an absolute path and a
  -- relative path.  Does not normalize the result. makeAbsolute returns
  -- Left msg if root is not absolute, or rel is not relative
  makeAbsolute :: FilePath -> FilePath -> Either String FilePath
  makeAbsolute root rel | not (isAbsolute root) = Left (root ++ " was not an absolute path.")
                        | not (isRelative rel)  = Left (rel ++ " was not a relative path.")
                        | otherwise             = Right (root </> rel)
  
  