pathwalk-0.2.0.0: src/System/Directory/PathWalk.hs
module System.Directory.PathWalk
( pathWalk
) where
import Control.Monad (forM_, filterM)
import Data.IORef (newIORef, readIORef, writeIORef)
import System.Directory (doesDirectoryExist, doesFileExist, getDirectoryContents)
import System.FilePath ((</>))
-- | 'pathWalk' recursively enumerates the given root directory,
-- calling callback once per directory with the traversed directory name, a list of subdirectories, and a list of files.
--
-- The subdirectories and file names are always relative to the root given.
--
-- @
-- pathWalk "src" $ \\dir subdirs files -> do
-- forM_ files $ \\file -> do
-- when ("Test.hs" \`isSuffixOf\` file) $ do
-- registerTestFile $ dir \</\> file
-- @
pathWalk :: FilePath -> (FilePath -> [FilePath] -> [FilePath] -> IO ()) -> IO ()
pathWalk root callback = do
names <- getDirectoryContents root
let properNames = filter (`notElem` [".", ".."]) names
dirs <- filterM (\n -> doesDirectoryExist $ root </> n) names
files <- filterM (\n -> doesFileExist $ root </> n) names
callback root dirs files
forM_ dirs $ \dir -> do
pathWalk (root </> dir) callback