!n%d       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~None27upathPath 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.txtDirectory format: foo/,  /foo/bar/UAll directories end in a trailing separator. There are no duplicate path separators //, no .., no ./, no ~/, etc.path>Normalized file path representation for the relative path rootpath Convert to a  type.VAll directories have a trailing slash, so if you want no trailing slash, you can use  from the filepath package.pathHelper function: check if the filepath has any parent directories in it. This handles the logic of checking for different path separators on Windows. path!Same as 'show . Path.toFilePath'.The following property holds: x == y "a show x == show y pathString ordering.The following property holds: 'show x `compare` show y "a x `compare` y pathString equality.The following property holds: show x == show y "a x == yNone27=?K4pathSame as .pathPath of some type. ts represents the type, whether file or directory. Pattern match to find whether the path is absolute or relative.path1Exceptions that can occur during path operations.pathA directory path.path A file path.path1A relative path; one without a root. Note that a ..R path component to represent the parent directory is not allowed by this library. pathAn absolute path.! path Construct a     using QuasiQuotes. #[absdir|/|] [absdir|/home/chris|] :Remember: due to the nature of absolute paths a path like [absdir|/home/chris|]V may compile on your platform, but it may not compile on another platform (Windows)." path Construct a    using QuasiQuotes. "[absdir|/home|]</>[reldir|chris|] # path Construct a     using QuasiQuotes. [absfile|/home/chris/foo.txt|] :Remember: due to the nature of absolute paths a path like [absdir|/home/chris/foo.txt|]V may compile on your platform, but it may not compile on another platform (Windows).$ path Construct a    using QuasiQuotes. +[absdir|/home/chris|]</>[relfile|foo.txt|] %pathAppend 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 &)&pathIf the directory in the first argument is a proper prefix of the path in the second argument strip it from the second argument, generating a path relative to the directory. Throws 6 if the directory is not a proper prefix of the path.The following properties hold: !stripProperPrefix x (x </> y) = y$Cases which are proven not possible: 5stripProperPrefix (a :: Path Abs &) (b :: Path Rel &) 5stripProperPrefix (a :: Path Rel &) (b :: Path Abs &)$In other words the bases must match.'pathfDetermines if the path in the first parameter is a proper prefix of the path in the second parameter.The following properties hold: not (x `isProperPrefixOf` x) x `isProperPrefixOf` (x </> y)(path+Take the parent path component from a path.The following properties hold: ;parent (x </> y) == x parent "/x" == "/" parent "x" == "." EOn the root (absolute or relative), getting the parent is idempotent: "parent "/" = "/" parent "." = "." )path Extract the file part of a path.The following properties hold:  filename (p </> a) == filename a*path*Extract the last directory name of a path.The following properties hold: *dirname $(mkRelDir ".") == $(mkRelDir ".") dirname (p </> a) == dirname a+path+ is the inverse of -M. It splits the given file path into a valid filename and a valid extension.WsplitExtension $(mkRelFile "name.foo" ) == Just ($(mkRelFile "name" ), ".foo" )WsplitExtension $(mkRelFile "name.foo." ) == Just ($(mkRelFile "name" ), ".foo." )WsplitExtension $(mkRelFile "name.foo.." ) == Just ($(mkRelFile "name" ), ".foo..")WsplitExtension $(mkRelFile "name.bar.foo" ) == Just ($(mkRelFile "name.bar"), ".foo" )WsplitExtension $(mkRelFile ".name.foo" ) == Just ($(mkRelFile ".name" ), ".foo" )WsplitExtension $(mkRelFile "name..foo" ) == Just ($(mkRelFile "name." ), ".foo" )WsplitExtension $(mkRelFile "....foo" ) == Just ($(mkRelFile "..." ), ".foo" )Throws  exception if the filename does not have an extension or in other words it cannot be split into a valid filename and a valid extension. The following cases throw an exception, please note that "." and ".." are not valid filenames:%splitExtension $(mkRelFile "name" )%splitExtension $(mkRelFile "name." )%splitExtension $(mkRelFile "name.." )%splitExtension $(mkRelFile ".name" )%splitExtension $(mkRelFile "..name" )%splitExtension $(mkRelFile "...name")+ and -6 are inverses of each other, the following laws hold: runcurry addExtension . swap >=> splitExtension == return splitExtension >=> uncurry addExtension . swap == return , path+Get extension from given file path. Throws M exception if the file does not have an extension. The following laws hold: `flip addExtension file >=> fileExtension == return fileExtension == (fmap snd) . splitExtension -path!Add extension to given file path.RaddExtension ".foo" $(mkRelFile "name" ) == Just $(mkRelFile "name.foo" )RaddExtension ".foo." $(mkRelFile "name" ) == Just $(mkRelFile "name.foo." )RaddExtension ".foo.." $(mkRelFile "name" ) == Just $(mkRelFile "name.foo.." )RaddExtension ".foo" $(mkRelFile "name.bar" ) == Just $(mkRelFile "name.bar.foo")RaddExtension ".foo" $(mkRelFile ".name" ) == Just $(mkRelFile ".name.foo" )RaddExtension ".foo" $(mkRelFile "name." ) == Just $(mkRelFile "name..foo" )RaddExtension ".foo" $(mkRelFile "..." ) == Just $(mkRelFile "....foo" ) Throws an K exception if the extension is not valid. A valid extension starts with a .3 followed by one or more characters not including . followed by zero or more . in trailing position. Moreover, an extension must be a valid filename, notably it cannot include path separators. Particularly, .foo.bar9 is an invalid extension, instead you have to first set .foo and then .bar8 individually. Some examples of invalid extensions are:+addExtension "foo" $(mkRelFile "name")+addExtension "..foo" $(mkRelFile "name")+addExtension ".foo.bar" $(mkRelFile "name")+addExtension ".foo/bar" $(mkRelFile "name").pathSAdd extension to given file path. Throws if the resulting filename does not parse.(addFileExtension "txt $(mkRelFile "foo") "foo.txt"3addFileExtension "symbols" $(mkRelFile "Data.List")"Data.List.symbols"4addFileExtension ".symbols" $(mkRelFile "Data.List")"Data.List.symbols"4addFileExtension "symbols" $(mkRelFile "Data.List.")"Data.List..symbols"5addFileExtension ".symbols" $(mkRelFile "Data.List.")"Data.List..symbols"1addFileExtension "evil/" $(mkRelFile "Data.List")/*** Exception: InvalidRelFile "Data.List.evil/"/pathA synonym for .< in the form of an infix operator. See more examples there.&$(mkRelFile "Data.List") <.> "symbols""Data.List.symbols"$$(mkRelFile "Data.List") <.> "evil/"/*** Exception: InvalidRelFile "Data.List.evil/"0pathsIf the file has an extension replace it with the given extension otherwise add the new extension to it. Throws an ? exception if the new extension is not a valid extension (see , for validity rules).The following law holds: B(fileExtension >=> flip replaceExtension file) file == return file1 path[Replace/add extension to given file path. Throws if the resulting filename does not parse.2pathA synonym for 1 in the form of an operator.3pathConvert an absolute  to a normalized absolute dir .Throws:  when the supplied path:is not an absolute path contains a ..1 path component representing the parent directoryis not a valid path (See )4pathConvert a relative  to a normalized relative dir .Throws:  when the supplied path:is not a relative pathis "" contains a ..1 path component representing the parent directoryis not a valid path (See )is all path separators5pathConvert an absolute  to a normalized absolute file .Throws:  when the supplied path:is not an absolute pathis a directory path i.e.has a trailing path separatoris . or ends in /. contains a ..1 path component representing the parent directoryis not a valid path (See )path$Is the string a valid absolute file?6pathConvert a relative  to a normalized relative file .Throws:  when the supplied path:is not a relative pathis ""is a directory path i.e.has a trailing path separatoris . or ends in /. contains a ..1 path component representing the parent directoryis not a valid path (See )path$Is the string a valid relative file?7path&Convert absolute path to directory to  type.8path&Convert relative path to directory to  type.9path!Convert absolute path to file to  type.:path!Convert relative path to file to  type.;pathMake a    .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).<pathMake a   .=pathMake a    .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).>pathMake a   .path7Normalizes directory path with platform-specific rules.pathVReplaces consecutive path seps with single sep and replaces alt sep with standard sep.pathNormalizes seps in whole path, but if there are 2+ seps at the beginning, they are normalized to exactly 2 to preserve UNC and Unicode prefixed paths.path0Normalizes seps only at the beginning of a path.path*Normalizes seps only at the end of a path.path6Applies platform-specific sep normalization following FilePath.normalise.pathConvert a valid path to a .?pathConvert a valid directory to a .@pathConvert a valid file to a .Apath Convert an absolute or relative  to a normalized  representing a directory.Throws:  when the supplied path: contains a ..1 path component representing the parent directoryis not a valid path (See )Bpath Convert an absolute or relative  to a normalized  representing a file.Throws:  when the supplied path:is a directory path i.e.has a trailing path separatoris . or ends in /. contains a ..1 path component representing the parent directoryis not a valid path (See )CpathSame as &.DpathSame as '.-pathExtension to addpath Old file namepath9New file name with the desired extension added at the end.pathExtension to addpath Old file namepath9New file name with the desired extension added at the end/path Old file namepathExtension to addpath9New file name with the desired extension added at the end0pathExtension to setpath Old file namepath(New file name with the desired extension1pathExtension to setpath Old file namepath(New file name with the desired extension2path Old file namepathExtension to setpath(New file name with the desired extension8 !"#$%&'()*+,-./0123456789:;<=>?@ABCD8 !"#$%&'()*-+,03456AB789:?@;<=>CD./12%5/727None8 !"#$%&'()*+,-./0123456789:;<=>?@ABCDNone27=?b4YpathSame as ].ZpathPath of some type. ts represents the type, whether file or directory. Pattern match to find whether the path is absolute or relative.]path1Exceptions that can occur during path operations.gpathA directory path.hpath A file path.ipath1A relative path; one without a root. Note that a ..R path component to represent the parent directory is not allowed by this library.jpathAn absolute path.k path Construct a  j g using QuasiQuotes. #[absdir|/|] [absdir|/home/chris|] :Remember: due to the nature of absolute paths a path like [absdir|/home/chris|]V may compile on your platform, but it may not compile on another platform (Windows).l path Construct a  i g using QuasiQuotes. "[absdir|/home|]</>[reldir|chris|] m path Construct a  j h using QuasiQuotes. [absfile|/home/chris/foo.txt|] :Remember: due to the nature of absolute paths a path like [absdir|/home/chris/foo.txt|]V may compile on your platform, but it may not compile on another platform (Windows).n path Construct a  i h using QuasiQuotes. +[absdir|/home/chris|]</>[relfile|foo.txt|] opathAppend 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 &)ppathIf the directory in the first argument is a proper prefix of the path in the second argument strip it from the second argument, generating a path relative to the directory. Throws d6 if the directory is not a proper prefix of the path.The following properties hold: !stripProperPrefix x (x </> y) = y$Cases which are proven not possible: 5stripProperPrefix (a :: Path Abs &) (b :: Path Rel &) 5stripProperPrefix (a :: Path Rel &) (b :: Path Abs &)$In other words the bases must match.qpathfDetermines if the path in the first parameter is a proper prefix of the path in the second parameter.The following properties hold: not (x `isProperPrefixOf` x) x `isProperPrefixOf` (x </> y)rpath+Take the parent path component from a path.The following properties hold: ;parent (x </> y) == x parent "/x" == "/" parent "x" == "." EOn the root (absolute or relative), getting the parent is idempotent: "parent "/" = "/" parent "." = "." spath Extract the file part of a path.The following properties hold:  filename (p </> a) == filename atpath*Extract the last directory name of a path.The following properties hold: *dirname $(mkRelDir ".") == $(mkRelDir ".") dirname (p </> a) == dirname aupathu is the inverse of wM. It splits the given file path into a valid filename and a valid extension.WsplitExtension $(mkRelFile "name.foo" ) == Just ($(mkRelFile "name" ), ".foo" )WsplitExtension $(mkRelFile "name.foo." ) == Just ($(mkRelFile "name" ), ".foo." )WsplitExtension $(mkRelFile "name.foo.." ) == Just ($(mkRelFile "name" ), ".foo..")WsplitExtension $(mkRelFile "name.bar.foo" ) == Just ($(mkRelFile "name.bar"), ".foo" )WsplitExtension $(mkRelFile ".name.foo" ) == Just ($(mkRelFile ".name" ), ".foo" )WsplitExtension $(mkRelFile "name..foo" ) == Just ($(mkRelFile "name." ), ".foo" )WsplitExtension $(mkRelFile "....foo" ) == Just ($(mkRelFile "..." ), ".foo" )Throws e exception if the filename does not have an extension or in other words it cannot be split into a valid filename and a valid extension. The following cases throw an exception, please note that "." and ".." are not valid filenames:%splitExtension $(mkRelFile "name" )%splitExtension $(mkRelFile "name." )%splitExtension $(mkRelFile "name.." )%splitExtension $(mkRelFile ".name" )%splitExtension $(mkRelFile "..name" )%splitExtension $(mkRelFile "...name")u and w6 are inverses of each other, the following laws hold: runcurry addExtension . swap >=> splitExtension == return splitExtension >=> uncurry addExtension . swap == return v path+Get extension from given file path. Throws eM exception if the file does not have an extension. The following laws hold: `flip addExtension file >=> fileExtension == return fileExtension == (fmap snd) . splitExtension wpath!Add extension to given file path.RaddExtension ".foo" $(mkRelFile "name" ) == Just $(mkRelFile "name.foo" )RaddExtension ".foo." $(mkRelFile "name" ) == Just $(mkRelFile "name.foo." )RaddExtension ".foo.." $(mkRelFile "name" ) == Just $(mkRelFile "name.foo.." )RaddExtension ".foo" $(mkRelFile "name.bar" ) == Just $(mkRelFile "name.bar.foo")RaddExtension ".foo" $(mkRelFile ".name" ) == Just $(mkRelFile ".name.foo" )RaddExtension ".foo" $(mkRelFile "name." ) == Just $(mkRelFile "name..foo" )RaddExtension ".foo" $(mkRelFile "..." ) == Just $(mkRelFile "....foo" ) Throws an fK exception if the extension is not valid. A valid extension starts with a .3 followed by one or more characters not including . followed by zero or more . in trailing position. Moreover, an extension must be a valid filename, notably it cannot include path separators. Particularly, .foo.bar9 is an invalid extension, instead you have to first set .foo and then .bar8 individually. Some examples of invalid extensions are:+addExtension "foo" $(mkRelFile "name")+addExtension "..foo" $(mkRelFile "name")+addExtension ".foo.bar" $(mkRelFile "name")+addExtension ".foo/bar" $(mkRelFile "name")xpathSAdd extension to given file path. Throws if the resulting filename does not parse.(addFileExtension "txt $(mkRelFile "foo") "foo.txt"3addFileExtension "symbols" $(mkRelFile "Data.List")"Data.List.symbols"4addFileExtension ".symbols" $(mkRelFile "Data.List")"Data.List.symbols"4addFileExtension "symbols" $(mkRelFile "Data.List.")"Data.List..symbols"5addFileExtension ".symbols" $(mkRelFile "Data.List.")"Data.List..symbols"1addFileExtension "evil/" $(mkRelFile "Data.List")/*** Exception: InvalidRelFile "Data.List.evil/"ypathA synonym for x< in the form of an infix operator. See more examples there.&$(mkRelFile "Data.List") <.> "symbols""Data.List.symbols"$$(mkRelFile "Data.List") <.> "evil/"/*** Exception: InvalidRelFile "Data.List.evil/"zpathsIf the file has an extension replace it with the given extension otherwise add the new extension to it. Throws an f? exception if the new extension is not a valid extension (see v for validity rules).The following law holds: B(fileExtension >=> flip replaceExtension file) file == return file{ path[Replace/add extension to given file path. Throws if the resulting filename does not parse.|pathA synonym for { in the form of an operator.}pathConvert an absolute  to a normalized absolute dir .Throws: ^ when the supplied path:is not an absolute path contains a ..1 path component representing the parent directoryis not a valid path (See )~pathConvert a relative  to a normalized relative dir .Throws: _ when the supplied path:is not a relative pathis "" contains a ..1 path component representing the parent directoryis not a valid path (See )is all path separatorspathConvert an absolute  to a normalized absolute file .Throws: ` when the supplied path:is not an absolute pathis a directory path i.e.has a trailing path separatoris . or ends in /. contains a ..1 path component representing the parent directoryis not a valid path (See )path$Is the string a valid absolute file?pathConvert a relative  to a normalized relative file .Throws: a when the supplied path:is not a relative pathis ""is a directory path i.e.has a trailing path separatoris . or ends in /. contains a ..1 path component representing the parent directoryis not a valid path (See )path$Is the string a valid relative file?path&Convert absolute path to directory to  type.path&Convert relative path to directory to  type.path!Convert absolute path to file to  type.path!Convert relative path to file to  type.pathMake a  j g.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).pathMake a  i g.pathMake a  j h.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).pathMake a  i h.path7Normalizes directory path with platform-specific rules.pathVReplaces consecutive path seps with single sep and replaces alt sep with standard sep.pathNormalizes seps in whole path, but if there are 2+ seps at the beginning, they are normalized to exactly 2 to preserve UNC and Unicode prefixed paths.path0Normalizes seps only at the beginning of a path.path*Normalizes seps only at the end of a path.path6Applies platform-specific sep normalization following FilePath.normalise.pathConvert a valid path to a .pathConvert a valid directory to a .pathConvert a valid file to a .path Convert an absolute or relative  to a normalized Z representing a directory.Throws: c when the supplied path: contains a ..1 path component representing the parent directoryis not a valid path (See )path Convert an absolute or relative  to a normalized Z representing a file.Throws: b when the supplied path:is a directory path i.e.has a trailing path separatoris . or ends in /. contains a ..1 path component representing the parent directoryis not a valid path (See )pathSame as p.pathSame as q.wpathExtension to addpath Old file namepath9New file name with the desired extension added at the endxpathExtension to addpath Old file namepath9New file name with the desired extension added at the endypath Old file namepathExtension to addpath9New file name with the desired extension added at the endzpathExtension to setpath Old file namepath(New file name with the desired extension{pathExtension to setpath Old file namepath(New file name with the desired extension|path Old file namepathExtension to setpath(New file name with the desired extension8YZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~8jihgZ[\]^_`abcdefklmnopqrstwuvz}~Yxy{|o5y7|7      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij_kabcdefghijl!path-0.7.1-1uadHYJ1q8M5kIu9r83lYU Path.Internal Path.Posix Path.WindowsSystem.FilePathdropTrailingPathSeparatorPath relRootFP toFilePath hasParentDir $fLiftPath$fHashablePath$fToJSONKeyPath $fToJSONPath $fNFDataPath $fShowPath $fOrdPath$fEqPath $fDataPath $fGenericPathPathParseExceptionSomeBaseAbsRel PathException InvalidAbsDir InvalidRelDirInvalidAbsFileInvalidRelFile InvalidFile InvalidDirNotAProperPrefixHasNoExtensionInvalidExtensionDirFileabsdirreldirabsfilerelfilestripProperPrefixisProperPrefixOfparentfilenamedirnamesplitExtension fileExtension addExtensionaddFileExtension<.>replaceExtensionsetFileExtension-<.> parseAbsDir parseRelDir parseAbsFile parseRelFile fromAbsDir fromRelDir fromAbsFile fromRelFilemkAbsDirmkRelDir mkAbsFile mkRelFile fromSomeDir fromSomeFile parseSomeDir parseSomeFilestripDir isParentOf$fFromJSONKeyPath$fFromJSONKeyPath0$fFromJSONPath$fFromJSONPath0$fFromJSONKeyPath1$fFromJSONKeyPath2$fFromJSONPath1$fFromJSONPath2$fExceptionPathException$fFromJSONSomeBase$fFromJSONSomeBase0$fHashableSomeBase$fToJSONSomeBase$fShowSomeBase$fNFDataSomeBase$fShowPathException$fEqPathException$fGenericSomeBase $fEqSomeBase $fOrdSomeBasebaseGHC.IOFilePathfilepath-1.4.2.1System.FilePath.PosixisValid validAbsFile validRelFile normalizeDirnormalizeAllSepsnormalizeWindowsSepsnormalizeLeadingSepsnormalizeTrailingSepsnormalizeFilePath fromSomeBaseSystem.FilePath.Windows