{- Util modul. Shold be dropped when misc is released as package. -} module Text.StringTemplates.Utils (directoryEntriesRecursive,directoryFilesRecursive,getRecursiveMTime) where import System.Directory import Data.List (isSuffixOf) import Data.Time.Clock (UTCTime) directoryEntriesRecursive :: FilePath -- ^ dir path to be searched for recursively -> IO ([FilePath], [FilePath]) -- ^ (list of all subdirs, list of all files) directoryEntriesRecursive path | "." `isSuffixOf` path = return ([], []) | otherwise = do isDir <- doesDirectoryExist path if isDir then do entries <- getDirectoryContents path let properEntries = map ((path ++ "/")++) entries results <- mapM directoryEntriesRecursive properEntries let (dirs, files) = biConcat results return (path:dirs, files) else return ([], [path]) where biConcat = (\(x, y) -> (concat x, concat y)) . unzip directoryFilesRecursive :: FilePath -- ^ dir path to be searched for recursively -> IO [FilePath] -- ^ list of all files in that dir directoryFilesRecursive path = snd `fmap` directoryEntriesRecursive path -- | Check recursively time of modification of any file(or dir) in directory getRecursiveMTime :: FilePath -> IO UTCTime getRecursiveMTime path = do (dirs, files) <- directoryEntriesRecursive path mtimes <- mapM getModificationTime $ dirs ++ files return $ maximum mtimes