    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)