Yitzchak Gale wrote:
I wrote:
...a tool for recursing through directories... How about a built-in function that represents a directory tree as a lazy Data.Tree?
Bryan O'Sullivan wrote:
See System.FilePath.Find in http://hackage.haskell.org/cgi-bin/hackage-scripts/package/FileManip-0.2
-- List all directories in the tree rooted at the given path traverseDirectories :: MonadIO m => TraversalDirection -> FilePath -> ListT m Directory
You could plug the above into your machinery for "recursion predicates" and all the other nice stuff.
Or - getting back to the "lazy Data.Tree" idea - we could define TreeT, analgous to ListT:
newtype TreeT m a = NodeT (m (a, TreeT (ListT m) a))
and give it a nice Monad instance. Then you can prune and filter trees in a natural way, inside the monad.
Eh, isn't that what ListT is already for? I mean, type Directory = FilePath contents :: MonadIO m => Directory -> m [FilePath] liftList :: Monad m => m [a] -> ListT m a runList :: Monad m => ListT m a -> m [a] allows you to prune the directory tree in whatever way you like it. Here's an example top-down traversal that lists all non-directories: allFiles :: MonadIO m => Directory -> m [FilePath] allFiles d = runList $ do f <- liftList $ contents d if isDirectory f then allFiles f else return f In other words, ListT is like one of those iterators I keep hearing from the Python/Java/.../imperative world (except that you can't suspend a traversal once started). Regards, apfelmus