{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 701
{-# LANGUAGE Trustworthy #-}
#endif

module Directory (
        Permissions( Permissions, readable, writable, executable, searchable ),
        createDirectory, removeDirectory, removeFile,
        renameDirectory, renameFile, getDirectoryContents,
        getCurrentDirectory, setCurrentDirectory,
        doesFileExist, doesDirectoryExist,
        getPermissions, setPermissions,
        getModificationTime
    ) where

import System.Directory hiding (Permissions,
                                readable, writable, executable, searchable,
                                getPermissions, setPermissions)
import qualified System.Directory as SD

data Permissions = Permissions {
                       readable   :: Bool,
                       writable   :: Bool,
                       executable :: Bool,
                       searchable :: Bool
                   }
    deriving (Eq, Ord, Read, Show)

getPermissions :: FilePath -> IO Permissions
getPermissions fp = do perm <- SD.getPermissions fp
                       return $ Permissions {
                                    readable   = SD.readable perm,
                                    writable   = SD.writable perm,
                                    executable = SD.executable perm,
                                    searchable = SD.searchable perm
                                }

setPermissions :: FilePath -> Permissions -> IO ()
setPermissions fp perm = let mkPerm = setOwnerReadable   (readable   perm)
                                    . setOwnerWritable   (writable  perm)
                                    . setOwnerExecutable (executable perm)
                                    . setOwnerSearchable (searchable perm)
                         in SD.setPermissions fp (mkPerm emptyPermissions)