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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to