aboutsummaryrefslogtreecommitdiff
path: root/ch18/CountEntries.hs
diff options
context:
space:
mode:
Diffstat (limited to 'ch18/CountEntries.hs')
-rw-r--r--ch18/CountEntries.hs22
1 files changed, 22 insertions, 0 deletions
diff --git a/ch18/CountEntries.hs b/ch18/CountEntries.hs
new file mode 100644
index 0000000..706bec2
--- /dev/null
+++ b/ch18/CountEntries.hs
@@ -0,0 +1,22 @@
+{-- snippet countEntriesTrad --}
+module CountEntries (listDirectory, countEntriesTrad) where
+
+import System.Directory (doesDirectoryExist, getDirectoryContents)
+import System.FilePath ((</>))
+import Control.Monad (forM, liftM)
+
+listDirectory :: FilePath -> IO [String]
+listDirectory = liftM (filter notDots) . getDirectoryContents
+ where notDots p = p /= "." && p /= ".."
+
+countEntriesTrad :: FilePath -> IO [(FilePath, Int)]
+countEntriesTrad path = do
+ contents <- listDirectory path
+ rest <- forM contents $ \name -> do
+ let newName = path </> name
+ isDir <- doesDirectoryExist newName
+ if isDir
+ then countEntriesTrad newName
+ else return []
+ return $ (path, length contents) : concat rest
+{-- /snippet countEntriesTrad --}