module Heart.Core.Directory where import Heart.Core.ListT import Heart.Core.Prelude import System.FilePath (()) import UnliftIO.Directory (doesDirectoryExist, doesPathExist, listDirectory) listDirectoryRecursively :: MonadIO m => FilePath -> ListT m FilePath listDirectoryRecursively path = ListT $ do pathExists <- doesPathExist path if pathExists then do dirExists <- doesDirectoryExist path if dirExists then do subPaths <- listDirectory path let rest = asum (fmap (listDirectoryRecursively . (path )) subPaths) pure (Just (path, rest)) else pure (Just (path, empty)) else pure empty searchDirectory :: MonadIO m => (FilePath -> m Bool) -> FilePath -> ListT m FilePath searchDirectory pcate path = filterListT pcate (listDirectoryRecursively path)