{-# LANGUAGE ScopedTypeVariables #-}
module EL.Private.File where
import qualified Control.Exception as Exception
import Control.Monad (guard)
import Data.Text (Text)
import qualified Data.Text.IO as Text.IO
import qualified System.Directory as Directory
import System.FilePath ((</>))
import qualified System.IO as IO
import qualified System.IO.Error as IO.Error
list :: FilePath -> IO [FilePath]
list dir = do
fns <- Directory.getDirectoryContents dir
return $ map (strip . (dir </>)) $ filter ((/=".") . take 1) fns
where
strip ('.' : '/' : path) = path
strip path = path
writeLines :: FilePath -> [Text] -> IO ()
writeLines fname lines = IO.withFile fname IO.WriteMode $ \hdl ->
mapM_ (Text.IO.hPutStrLn hdl) lines
ignoreEnoent :: IO a -> IO (Maybe a)
ignoreEnoent = ignoreError IO.Error.isDoesNotExistError
ignoreEOF :: IO a -> IO (Maybe a)
ignoreEOF = ignoreError IO.Error.isEOFError
ignoreIOError :: IO a -> IO (Maybe a)
ignoreIOError = ignoreError (\(_ :: IO.Error.IOError) -> True)
ignoreError :: Exception.Exception e => (e -> Bool) -> IO a -> IO (Maybe a)
ignoreError ignore action = Exception.handleJust (guard . ignore)
(const (return Nothing)) (fmap Just action)
tryIO :: IO a -> IO (Either IO.Error.IOError a)
tryIO = Exception.try