{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Control.Monad (filterM, (<=<))
import Control.Monad.IO.Class (liftIO)
import Criterion.Main
import Data.DirStream
import qualified Filesystem.Path as F
import Pipes (every, for, runEffect)
import Pipes.Safe (runSafeT)
import System.Directory (doesDirectoryExist)
import System.Directory.Recursive
-- todo use http://hackage.haskell.org/package/pipes-4.3.9/docs/Pipes-Prelude.html#v:toListM
dirstreamGet :: F.FilePath -> IO ()
dirstreamGet fp =
runSafeT $ runEffect $
for (every (descendentOf fp)) (liftIO . (\x -> pure $ x `seq` ()))
discard :: Functor f => f a -> f ()
discard = fmap (\x -> x `seq` ())
filtered :: FilePath -> IO [FilePath]
filtered = filterM doesDirectoryExist <=< getDirRecursive
main :: IO ()
main =
defaultMain [ bgroup "."
[ bench "getDirRecursive" $ nfIO (discard <$> getDirRecursive ".")
, bench "DirStream" $ nfIO (dirstreamGet ".")
]
, bgroup "dirs"
[ bench "getSubdirsRecursive" $ nfIO (discard <$> getSubdirsRecursive ".")
, bench "filterM doesDirectoryExist <=< getDirRecursive" $ nfIO (discard <$> filtered ".")
]
]