acid-state-0.14.1: benchmarks/loading/Benchmark/FileSystem.hs
module Benchmark.FileSystem
(
copy,
removeTreeIfExists,
exists,
getTemporaryDirectory,
module Filesystem,
module Filesystem.Path.CurrentOS
)
where
import Benchmark.Prelude hiding (stripPrefix, last)
import Filesystem.Path.CurrentOS
import Filesystem
import qualified System.Directory as Directory
import Debug.Trace
import qualified Data.List as List
removeTreeIfExists :: FilePath -> IO ()
removeTreeIfExists path = removeTree path `catch` \e -> case e of
_ | isDoesNotExistError e -> return ()
| otherwise -> throwIO e
exists :: FilePath -> IO Bool
exists path = do
isDir <- isDirectory path
isFile <- isFile path
return $ isDir || isFile
getTemporaryDirectory :: IO FilePath
getTemporaryDirectory =
Directory.getTemporaryDirectory >>= return . decodeString
copy :: FilePath -> FilePath -> IO ()
copy from to = do
isDir <- isDirectory from
if isDir
then copyDirectory from to
else copyFile from to
copyDirectory :: FilePath -> FilePath -> IO ()
copyDirectory path path' = do
members <- listDirectory path
let members' = do
member <- members
let relative =
fromMaybe (error "Unexpectedly empty member path") $
last member
return $ path' <> relative
sequence_ $ zipWith copy members members'
last :: FilePath -> Maybe FilePath
last p = case splitDirectories p of
[] -> Nothing
l -> Just $ List.last l