content: 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
  