| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Hackage.Security.Util.Path
Contents
Description
A more type-safe version of file paths
This module is intended to replace imports of System.FilePath, and additionally exports thin wrappers around common IO functions. To facilitate importing this module unqualified we also re-export some definitions from System.IO (importing both would likely lead to name clashes).
Note that his module does not import any other modules from Hackage.Security; everywhere else we use Path instead of FilePath directly.
- newtype Path a = Path FilePath
- castRoot :: Path root -> Path root'
- takeDirectory :: Path a -> Path a
- takeFileName :: Path a -> String
- (<.>) :: Path a -> String -> Path a
- splitExtension :: Path a -> (Path a, String)
- takeExtension :: Path a -> String
- data Unrooted
- (</>) :: Path a -> Path Unrooted -> Path a
- rootPath :: Path Unrooted -> Path root
- unrootPath :: Path root -> Path Unrooted
- toUnrootedFilePath :: Path Unrooted -> FilePath
- fromUnrootedFilePath :: FilePath -> Path Unrooted
- fragment :: String -> Path Unrooted
- joinFragments :: [String] -> Path Unrooted
- splitFragments :: Path Unrooted -> [String]
- isPathPrefixOf :: Path Unrooted -> Path Unrooted -> Bool
- data Relative
- data Absolute
- data HomeDir
- class FsRoot root where
- data FsPath = FsRoot root => FsPath (Path root)
- toFilePath :: Path Absolute -> FilePath
- fromFilePath :: FilePath -> FsPath
- makeAbsolute :: FsPath -> IO (Path Absolute)
- fromAbsoluteFilePath :: FilePath -> Path Absolute
- withFile :: FsRoot root => Path root -> IOMode -> (Handle -> IO r) -> IO r
- openTempFile' :: FsRoot root => Path root -> String -> IO (Path Absolute, Handle)
- readLazyByteString :: FsRoot root => Path root -> IO ByteString
- readStrictByteString :: FsRoot root => Path root -> IO ByteString
- writeLazyByteString :: FsRoot root => Path root -> ByteString -> IO ()
- writeStrictByteString :: FsRoot root => Path root -> ByteString -> IO ()
- copyFile :: (FsRoot root, FsRoot root') => Path root -> Path root' -> IO ()
- createDirectory :: FsRoot root => Path root -> IO ()
- createDirectoryIfMissing :: FsRoot root => Bool -> Path root -> IO ()
- removeDirectory :: FsRoot root => Path root -> IO ()
- doesFileExist :: FsRoot root => Path root -> IO Bool
- doesDirectoryExist :: FsRoot root => Path root -> IO Bool
- getModificationTime :: FsRoot root => Path root -> IO UTCTime
- removeFile :: FsRoot root => Path root -> IO ()
- getTemporaryDirectory :: IO (Path Absolute)
- getDirectoryContents :: FsRoot root => Path root -> IO [Path Unrooted]
- getRecursiveContents :: FsRoot root => Path root -> IO [Path Unrooted]
- renameFile :: (FsRoot root, FsRoot root') => Path root -> Path root' -> IO ()
- getCurrentDirectory :: IO (Path Absolute)
- data Tar
- tarIndexLookup :: TarIndex -> Path Tar -> Maybe TarIndexEntry
- tarAppend :: (FsRoot root, FsRoot root') => Path root -> Path root' -> [Path Tar] -> IO ()
- data Web
- toURIPath :: FilePath -> Path Web
- fromURIPath :: Path Web -> FilePath
- uriPath :: URI -> Path Web
- modifyUriPath :: URI -> (Path Web -> Path Web) -> URI
- data IOMode :: *
- data BufferMode :: *
- = NoBuffering
- | LineBuffering
- | BlockBuffering (Maybe Int)
- data Handle :: *
- data SeekMode :: *
- hSetBuffering :: Handle -> BufferMode -> IO ()
- hClose :: Handle -> IO ()
- hFileSize :: Handle -> IO Integer
- hSeek :: Handle -> SeekMode -> Integer -> IO ()
Paths
Paths
A Path is simply a FilePath with a type-level tag indicating where this
path is rooted (relative to the current directory, absolute path, relative to
a web domain, whatever). Most operations on Path are just lifted versions
of the operations on the underlying FilePath. The tag however allows us to
give a lot of operations a more meaningful type. For instance, it does not
make sense to append two absolute paths together; instead, we can only append
an unrooted path to another path. It also means we avoid bugs where we use
one kind of path where we expect another.
Constructors
| Path FilePath |
Instances
| Monad m => FromObjectKey m (Path root) # | |
| Monad m => ToObjectKey m (Path root) # | |
| Eq (Path a) # | |
| Ord (Path a) # | |
| Show (Path a) # | |
| Pretty (Path Tar) # | |
| Pretty (Path HomeDir) # | |
| Pretty (Path Absolute) # | |
| Pretty (Path Relative) # | |
| Pretty (Path Unrooted) # | |
| Pretty (Path CacheRoot) # | |
| Pretty (Path IndexRoot) # | |
| Pretty (Path RepoRoot) # | |
castRoot :: Path root -> Path root' #
Reinterpret the root of a path
This literally just changes the type-level tag; use with caution!
FilePath-like operations on paths with arbitrary roots
takeDirectory :: Path a -> Path a #
takeFileName :: Path a -> String #
splitExtension :: Path a -> (Path a, String) #
takeExtension :: Path a -> String #
Unrooted paths
Type-level tag for unrooted paths
Unrooted paths need a root before they can be interpreted.
rootPath :: Path Unrooted -> Path root #
Reinterpret an unrooted path
This is an alias for castRoot; see comments there.
unrootPath :: Path root -> Path Unrooted #
Forget a path's root
This is an alias for castRoot; see comments there.
toUnrootedFilePath :: Path Unrooted -> FilePath #
Convert a relative/unrooted Path to a FilePath (using POSIX style directory separators).
See also toAbsoluteFilePath
fromUnrootedFilePath :: FilePath -> Path Unrooted #
Convert from a relative/unrooted FilePath (using POSIX style directory separators).
joinFragments :: [String] -> Path Unrooted #
splitFragments :: Path Unrooted -> [String] #
File-system paths
A file system root can be interpreted as an (absolute) FilePath
Minimal complete definition
Methods
toAbsoluteFilePath :: Path root -> IO FilePath #
Convert a Path to an absolute FilePath (using native style directory separators).
Abstract over a file system root
see fromFilePath
Conversions
toFilePath :: Path Absolute -> FilePath #
fromFilePath :: FilePath -> FsPath #
makeAbsolute :: FsPath -> IO (Path Absolute) #
fromAbsoluteFilePath :: FilePath -> Path Absolute #
Wrappers around System.IO
openTempFile' :: FsRoot root => Path root -> String -> IO (Path Absolute, Handle) #
Wrapper around openBinaryTempFileWithDefaultPermissions
NOTE: The caller is responsible for cleaning up the temporary file.
Wrappers around Data.ByteString
readLazyByteString :: FsRoot root => Path root -> IO ByteString #
readStrictByteString :: FsRoot root => Path root -> IO ByteString #
writeLazyByteString :: FsRoot root => Path root -> ByteString -> IO () #
writeStrictByteString :: FsRoot root => Path root -> ByteString -> IO () #
Wrappers around System.Directory
createDirectory :: FsRoot root => Path root -> IO () #
createDirectoryIfMissing :: FsRoot root => Bool -> Path root -> IO () #
removeDirectory :: FsRoot root => Path root -> IO () #
doesFileExist :: FsRoot root => Path root -> IO Bool #
doesDirectoryExist :: FsRoot root => Path root -> IO Bool #
getModificationTime :: FsRoot root => Path root -> IO UTCTime #
removeFile :: FsRoot root => Path root -> IO () #
getTemporaryDirectory :: IO (Path Absolute) #
getDirectoryContents :: FsRoot root => Path root -> IO [Path Unrooted] #
Return the immediate children of a directory
Filters out "." and "..".
getRecursiveContents :: FsRoot root => Path root -> IO [Path Unrooted] #
Recursive traverse a directory structure
Returns a set of paths relative to the directory specified. The list is lazily constructed, so that directories are only read when required. (This is also essential to ensure that this function does not build the entire result in memory before returning, potentially running out of heap.)
getCurrentDirectory :: IO (Path Absolute) #
Wrappers around Codec.Archive.Tar
tarIndexLookup :: TarIndex -> Path Tar -> Maybe TarIndexEntry #
Wrappers around Network.URI
fromURIPath :: Path Web -> FilePath #
Re-exports
Constructors
| ReadMode | |
| WriteMode | |
| AppendMode | |
| ReadWriteMode |
data BufferMode :: * #
Constructors
| NoBuffering | |
| LineBuffering | |
| BlockBuffering (Maybe Int) |
Instances
| Eq BufferMode | |
| Ord BufferMode | |
| Read BufferMode | |
| Show BufferMode | |
Constructors
| AbsoluteSeek | |
| RelativeSeek | |
| SeekFromEnd |
hSetBuffering :: Handle -> BufferMode -> IO () #