module Main where import System.Directory.Tree import qualified Data.Foldable as F import System.IO import Control.Monad main = du "/etc" -- Here are a few examples of using the directory-tree package to recreate -- the basic functionality of some linux command-line tools. This module -- uses the lazy directory building IO provided by `readDirectoryWithL`: -- the command `ls `. Try: -- ghci> ls "/" -- ...IO is done lazily. ls :: FileName -> IO () ls d = do (_ :/ Dir _ c) <- readDirectoryWithL readFile d mapM_ (putStrLn . name) c -- the command `du -bs 2> /dev/null` gets the total size of all files -- under the supplied directory. We use a more compositional style here, where -- (<=<) is equivalent to (.) but for monadic functions (a -> m b): du :: FileName -> IO () du = print . F.foldl' (+) 0 . free <=< readDirectoryWithL (hFileSize <=< readHs) where readHs = flip openFile ReadMode