úÎ5©3Í     None*+CPath of some base and type.>Internally is a string. The string can be of two formats only:  File format: file.txt,  foo/bar.txt,  /foo/bar.txtDirectory format: foo/,  /foo/bar/UAll directories end in a trailing separator. There are no duplicate path separators //, no .., no ./, no ~/, etc.Same as .The following property holds: x == y "a show x == show yString ordering.The following property holds: 'show x `compare` show y "a x `compare` yString equality.The following property holds: show x == show y "a x == yNone+="Exception when parsing a location.A directory path. A file path.$A relative path; one without a root.An absolute path.mGet a location for an absolute directory. Produces a normalized path which always ends in a path separator.Throws: kGet a location for a relative directory. Produces a normalized path which always ends in a path separator.Throws:  $Get a location for an absolute file.Throws:  #Get a location for a relative file.Throws: –Helper function: check if the filepath has any parent directories in it. This handles the logic of checking for different path separators on Windows. Make a 'Path Abs Dir'.9Remember: due to the nature of absolute paths this (e.g.  /home/fooW) may compile on your platform, but it may not compile on another platform (Windows). Make a 'Path Rel Dir'. Make a 'Path Abs File'.9Remember: due to the nature of absolute paths this (e.g.  /home/fooW) may compile on your platform, but it may not compile on another platform (Windows).Make a 'Path Rel File'. Convert to a  type.VAll directories have a trailing slash, so if you want no trailing slash, you can use  from the filepath package.Append two paths.6The 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))1The following are proven not possible to express: $(mkAbsFile &) </> x $(mkRelFile &) </> x x </> $(mkAbsFile &) x </> $(mkAbsDir &)JStrip directory from path, making it relative to that directory. Returns * 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.Throws: >Is p a parent of the given location? Implemented in terms of . The bases must match.: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 "/") = "/" Extract the file part of a path.The following properties hold:  filename (p </> a) == filename a*Extract the last directory name of a path.The following properties hold: dirname (p </> a) == dirname a)Internal use for normalizing a directory.*Internal use for normalizing a fileectory. !"  #    !"  #$      !"#$%&'()*path_BMpVqxC01XN5OKbZst69w9 Path.InternalPath toFilePathSystem.FilePathdropTrailingPathSeparatorPathParseExceptionDirFileRelAbs parseAbsDir parseRelDir parseAbsFile parseRelFilemkAbsDirmkRelDir mkAbsFile mkRelFilestripDir isParentOfparentfilenamedirname $fShowPath $fOrdPath$fEqPath hasParentDirbaseGHC.IOFilePathGHC.BaseNothingCouldn'tStripPrefixDir normalizeDir normalizeFile InvalidAbsDir InvalidRelDirInvalidAbsFileInvalidRelFile$fExceptionPathParseException