#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,
                                getModificationTime)
import qualified System.Directory as SD
import System.Time(ClockTime(..))
#ifdef UTCTIME_IN_DIRECTORY
import Data.Time.Clock.POSIX(utcTimeToPOSIXSeconds)

getModificationTime = fmap toClockTime . SD.getModificationTime
toClockTime = flip TOD 0 . floor . realToFrac . utcTimeToPOSIXSeconds

#else
getModificationTime = SD.getModificationTime
#endif
getModificationTime :: FilePath -> IO ClockTime

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)