{-# LANGUAGE FlexibleContexts #-}
module Purebred.System.Directory
( listDirectory'
, filePathToEntry
) where
import Control.Exception.Base (IOException)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Except (MonadError, throwError)
import Control.Exception (try)
import System.Directory (listDirectory, doesDirectoryExist)
import System.FilePath ((</>))
import Data.List (sort)
import Error
import Types
listDirectory' :: (MonadError Error m, MonadIO m) => FilePath -> m [FileSystemEntry]
listDirectory' path = liftIO (try $ listDirectory path)
>>= either (throwError . convertError) (fmap sort <$> traverse (filePathToEntry path))
where convertError :: IOException -> Error
convertError = GenericError . show
filePathToEntry :: (MonadIO m) => FilePath -> FilePath -> m FileSystemEntry
filePathToEntry base filename = do
exists <- liftIO $ doesDirectoryExist (base </> filename)
pure $ if exists then Directory filename else File filename