module File(
forEachFile
, forEachFile'
) where
import System.Directory
import System.FilePath
import Control.Monad
-- | Performs width traversion of given directory
forEachFile :: FilePath -- ^ Directory to traverse
-> (FilePath -> Bool) -- ^ File selector
-> (a -> FilePath -> IO a) -- ^ Function to perform (mimics fold)
-> a -- ^ Start value of acum
-> IO a -- ^ Last value of accum
forEachFile path predf f acc = go acc path
where
go a inputPath = do
names <- fmap (\p -> inputPath ++ "/" ++ p) <$> getDirectoryContents inputPath
dirs <- filter (not . isSystemDir) <$> filterM doesDirectoryExist names
files <- filter predf <$> filterM doesFileExist names
a' <- foldM f a files
a' `seq` foldM go a' dirs
isSystemDir s = let bs = takeFileName s in bs == "." || bs == ".."
-- | Performs width traversion of given directory, simplified versino of forEachFile
forEachFile' :: FilePath -- ^ Directory to traverse
-> (FilePath -> Bool) -- ^ File selector
-> (FilePath -> IO ()) -- ^ Function to perform
-> IO ()
forEachFile' path predf f = forEachFile path predf (const f) ()