import Data.Foldable (traverse_)
import System.Environment (getArgs)
import System.Directory.Extra
import Control.Monad.Extra (whenM, ifM, zipWithM)
import Data.IORef (newIORef, modifyIORef', readIORef)
fileCount :: FilePath -> IO Int
fileCount fp = do
cnt <- newIORef 0
whenM (doesDirectoryExist fp) $ go cnt fp
readIORef cnt
where
go cnt fp = listContents fp >>= traverse_ (processEntry cnt)
processEntry cnt fp = ifM (doesDirectoryExist fp) (go cnt fp) (inc cnt)
inc cnt = modifyIORef' cnt (+ 1)
fileCount' :: FilePath -> IO Int
fileCount' fp = length <$> listFilesRecursive fp
main = do
args <- getArgs
xs <- traverse fileCount args
zipWithM printEntry args xs
where
printEntry fp n = putStrLn (show n ++ "\t" ++ fp)