    {-# LANGUAGE CPP #-}

    module Distribution.Compat.Directory
    ( listDirectory
    , makeAbsolute
    , doesPathExist
    ) where

    #if MIN_VERSION_directory(1,2,7)
    import System.Directory as Dir hiding (doesPathExist)
    import System.Directory (doesPathExist)
    #else
    import System.Directory as Dir
    #endif
    #if !MIN_VERSION_directory(1,2,2)
    import System.FilePath as Path
    #endif

    #if !MIN_VERSION_directory(1,2,5)

    listDirectory :: FilePath -> IO [FilePath]
    listDirectory path =
      filter f `fmap` Dir.getDirectoryContents path
      where f filename = filename /= "." && filename /= ".."

    #endif

    #if !MIN_VERSION_directory(1,2,2)

    makeAbsolute :: FilePath -> IO FilePath
    makeAbsolute p | Path.isAbsolute p = return p
                   | otherwise         = do
        cwd <- Dir.getCurrentDirectory
        return $ cwd </> p

    #endif

    #if !MIN_VERSION_directory(1,2,7)

    doesPathExist :: FilePath -> IO Bool
    doesPathExist path = do
        -- not using Applicative, as this way we can do less IO
        e <- doesDirectoryExist path
        if e
        then return True
        else doesFileExist path

    #endif