-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Support for well-typed paths
--   
--   Support for well-typed paths.
@package path
@version 0.5.13

-- | Internal types and functions.
module Path.Internal

-- | Path of some base and type.
--   
--   The type variables are:
--   
--   
--   
- b — base, the base location of the path; absolute or
--   relative.
--   
- t — type, whether file or directory.
--   
--   
--   Internally is a string. The string can be of two formats only:
--   
--   
--   
- File format: file.txt, foo/bar.txt,
--   /foo/bar.txt
--   
- Directory format: foo/, /foo/bar/
--   
--   
--   All directories end in a trailing separator. There are no duplicate
--   path separators //, no .., no ./, no
--   ~/, etc.
newtype Path b t
Path :: FilePath -> Path b t

-- | Helper function: check if the filepath has any parent directories in
--   it. This handles the logic of checking for different path separators
--   on Windows.
hasParentDir :: FilePath -> Bool
instance GHC.Classes.Eq (Path.Internal.Path b t)
instance GHC.Classes.Ord (Path.Internal.Path b t)
instance GHC.Show.Show (Path.Internal.Path b t)
instance Control.DeepSeq.NFData (Path.Internal.Path b t)
instance Data.Aeson.Types.ToJSON.ToJSON (Path.Internal.Path b t)
instance Data.Hashable.Class.Hashable (Path.Internal.Path b t)

-- | Support for well-typed paths.
module Path

-- | Path of some base and type.
--   
--   The type variables are:
--   
--   
--   
- b — base, the base location of the path; absolute or
--   relative.
--   
- t — type, whether file or directory.
--   
--   
--   Internally is a string. The string can be of two formats only:
--   
--   
--   
- File format: file.txt, foo/bar.txt,
--   /foo/bar.txt
--   
- Directory format: foo/, /foo/bar/
--   
--   
--   All directories end in a trailing separator. There are no duplicate
--   path separators //, no .., no ./, no
--   ~/, etc.
data Path b t

-- | An absolute path.
data Abs

-- | A relative path; one without a root. Note that a . as well as
--   any path starting with a .. is not a valid relative path. In
--   other words, a relative path is always strictly under the directory
--   tree to which it is relative.
data Rel

-- | A file path.
data File

-- | A directory path.
data Dir

-- | Construct a Path Abs Dir using QuasiQuotes.
--   
--   
--   [absdir|/|]
--   
--   [absdir|/home/chris|]
--   
--   
--   Remember: due to the nature of absolute paths a path like
--   [absdir|/home/chris|] may compile on your platform, but it
--   may not compile on another platform (Windows).
absdir :: QuasiQuoter

-- | Construct a Path Rel Dir using QuasiQuotes.
--   
--   
--   [absdir|/home|]</>[reldir|chris|]
--   
reldir :: QuasiQuoter

-- | Construct a Path Abs File using QuasiQuotes.
--   
--   
--   [absfile|/home/chris/foo.txt|]
--   
--   
--   Remember: due to the nature of absolute paths a path like
--   [absdir|/home/chris/foo.txt|] may compile on your platform,
--   but it may not compile on another platform (Windows).
absfile :: QuasiQuoter

-- | Construct a Path Rel File using QuasiQuotes.
--   
--   
--   [absdir|/home/chris|]</>[relfile|foo.txt|]
--   
relfile :: QuasiQuoter

-- | Append two paths.
--   
--   The following cases are valid and the equalities hold:
--   
--   
--   $(mkAbsDir x) </> $(mkRelDir y) = $(mkAbsDir (x ++ "/" ++ y))
--   
--   
--   
--   $(mkAbsDir x) </> $(mkRelFile y) = $(mkAbsFile (x ++ "/" ++ y))
--   
--   
--   
--   $(mkRelDir x) </> $(mkRelDir y) = $(mkRelDir (x ++ "/" ++ y))
--   
--   
--   
--   $(mkRelDir x) </> $(mkRelFile y) = $(mkRelFile (x ++ "/" ++ y))
--   
--   
--   The following are proven not possible to express:
--   
--   
--   $(mkAbsFile …) </> x
--   
--   
--   
--   $(mkRelFile …) </> x
--   
--   
--   
--   x </> $(mkAbsFile …)
--   
--   
--   
--   x </> $(mkAbsDir …)
--   
(</>) :: Path b Dir -> Path Rel t -> Path b t

-- | Strip directory from path, making it relative to that directory.
--   Throws Couldn'tStripPrefixDir if directory is not a parent of
--   the path.
--   
--   The following properties hold:
--   
--   
--   stripDir x (x </> y) = y
--   
--   
--   Cases which are proven not possible:
--   
--   
--   stripDir (a :: Path Abs …) (b :: Path Rel …)
--   
--   
--   
--   stripDir (a :: Path Rel …) (b :: Path Abs …)
--   
--   
--   In other words the bases must match.
stripDir :: MonadThrow m => Path b Dir -> Path b t -> m (Path Rel t)

-- | Is p a parent of the given location? Implemented in terms of
--   stripDir. The bases must match.
--   
--   The following properties hold:
--   
--   
--   not (x `isParentOf` x)
--   
--   
--   
--   x `isParentOf` (x </> y)
--   
isParentOf :: Path b Dir -> Path b t -> Bool

-- | Take the absolute parent directory from the absolute path.
--   
--   The following properties hold:
--   
--   
--   parent (x </> y) == x
--   
--   
--   On the root, getting the parent is idempotent:
--   
--   
--   parent (parent "/") = "/"
--   
parent :: Path Abs t -> Path Abs Dir

-- | Extract the file part of a path.
--   
--   The following properties hold:
--   
--   
--   filename (p </> a) == filename a
--   
filename :: Path b File -> Path Rel File

-- | Extract the last directory name of a path.
--   
--   The following properties hold:
--   
--   
--   dirname (p </> a) == dirname a
--   
dirname :: Path b Dir -> Path Rel Dir

-- | Get extension from given file path.
fileExtension :: Path b File -> String

-- | Replace/add extension to given file path. Throws if the resulting
--   filename does not parse.
setFileExtension :: MonadThrow m => String -> Path b File -> m (Path b File)

-- | Convert an absolute FilePath to a normalized absolute dir
--   Path.
--   
--   Throws: PathParseException when the supplied path:
--   
--   
--   
- is not an absolute path
--   
- contains a .. anywhere in the path
--   
- is not a valid path (See isValid)
--   
parseAbsDir :: MonadThrow m => FilePath -> m (Path Abs Dir)

-- | Convert a relative FilePath to a normalized relative dir
--   Path.
--   
--   Throws: PathParseException when the supplied path:
--   
--   
--   
- is not a relative path
--   
- is any of "", . or ..
--   
- contains .. anywhere in the path
--   
- is not a valid path (See isValid)
--   
parseRelDir :: MonadThrow m => FilePath -> m (Path Rel Dir)

-- | Convert an absolute FilePath to a normalized absolute file
--   Path.
--   
--   Throws: PathParseException when the supplied path:
--   
--   
--   
- is not an absolute path
--   
- has a trailing path separator
--   
- contains .. anywhere in the path
--   
- ends in /.
--   
- is not a valid path (See isValid)
--   
parseAbsFile :: MonadThrow m => FilePath -> m (Path Abs File)

-- | Convert a relative FilePath to a normalized relative file
--   Path.
--   
--   Throws: PathParseException when the supplied path:
--   
--   
--   
- is not a relative path
--   
- has a trailing path separator
--   
- is "", . or ..
--   
- contains .. anywhere in the path
--   
- is not a valid path (See isValid)
--   
parseRelFile :: MonadThrow m => FilePath -> m (Path Rel File)

-- | Exception when parsing a location.
data PathParseException

-- | Convert to a FilePath type.
--   
--   All directories have a trailing slash, so if you want no trailing
--   slash, you can use dropTrailingPathSeparator from the filepath
--   package.
toFilePath :: Path b t -> FilePath

-- | Convert absolute path to directory to FilePath type.
fromAbsDir :: Path Abs Dir -> FilePath

-- | Convert relative path to directory to FilePath type.
fromRelDir :: Path Rel Dir -> FilePath

-- | Convert absolute path to file to FilePath type.
fromAbsFile :: Path Abs File -> FilePath

-- | Convert relative path to file to FilePath type.
fromRelFile :: Path Rel File -> FilePath

-- | Make a Path Abs Dir'.
--   
--   Remember: due to the nature of absolute paths this (e.g.
--   /home/foo) may compile on your platform, but it may not
--   compile on another platform (Windows).
mkAbsDir :: FilePath -> Q Exp

-- | Make a Path Rel Dir.
mkRelDir :: FilePath -> Q Exp

-- | Make a Path Abs File.
--   
--   Remember: due to the nature of absolute paths this (e.g.
--   /home/foo) may compile on your platform, but it may not
--   compile on another platform (Windows).
mkAbsFile :: FilePath -> Q Exp

-- | Make a Path Rel File.
mkRelFile :: FilePath -> Q Exp
instance GHC.Show.Show Path.PathParseException
instance Data.Aeson.Types.FromJSON.FromJSON (Path.Internal.Path Path.Abs Path.File)
instance Data.Aeson.Types.FromJSON.FromJSON (Path.Internal.Path Path.Rel Path.File)
instance Data.Aeson.Types.FromJSON.FromJSON (Path.Internal.Path Path.Abs Path.Dir)
instance Data.Aeson.Types.FromJSON.FromJSON (Path.Internal.Path Path.Rel Path.Dir)
instance GHC.Exception.Exception Path.PathParseException
