System.Directory.PathWalk is an implementation of Python's excellent
os.walk function. Given a root directory, it recursively scans all
subdirectories, calling a callback with directories and files it finds.
Importantly, it calls the callback as soon as it finishes scanning each
directory to allow the caller to begin processing results immediately.
Maximum memory usage is O(N+M) where N is the depth of the tree and M is the maximum number of entries in a particular directory.
import System.Directory.PathWalk pathWalk "some/directory" $ \root dirs files -> do forM_ files $ \file -> when (".hs" `isSuffixOf` file) $ do putStrLn $ joinPath [root, file]