úÎ!QŻIŤ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~None27ĄpathPath 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.path–Helper 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 == yNone2=?ފ.pathSame as .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 &)!pathˇIf 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/"+pathsIf 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 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 separators0pathConvert 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?1pathConvert 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?2path&Convert absolute path to directory to  type.3path&Convert relative path to directory to  type.4path!Convert absolute path to file to  type.5path!Convert relative path to file to  type.6pathMake 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).7pathMake a   .8pathMake 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).9pathMake a   .ƒpath7Normalizes directory path with platform-specific rules.„pathVReplaces consecutive path seps with single sep and replaces alt sep with standard sep.…path™Normalizes 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.:pathSame as !.;pathSame 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 end+pathExtension 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 extension/ !"#$%&'()*+,-./0123456789:;/ !"#$%(&'+./0123456789:;)*,- 5*7-7None°y/ !"#$%&'()*+,-./0123456789:;None2=?Gö.GpathSame as H.Hpath1Exceptions that can occur during path operations.PpathA directory path.Qpath A file path.Rpath1A relative path; one without a root. Note that a ..R path component to represent the parent directory is not allowed by this library.SpathAn absolute path.T path Construct a  S P 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).U path Construct a  R P using QuasiQuotes. "[absdir|/home|]</>[reldir|chris|] V path Construct a  S Q 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).W path Construct a  R Q using QuasiQuotes. +[absdir|/home/chris|]</>[relfile|foo.txt|] XpathAppend 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 &)YpathˇIf 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 M6 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.ZpathfDetermines 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 Né 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 NM 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 OK 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")apathSAdd 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/"bpathA synonym for a< 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/"cpathsIf the file has an extension replace it with the given extension otherwise add the new extension to it. Throws an O? 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 filed path[Replace/add extension to given file path. Throws if the resulting filename does not parse.epathA synonym for d in the form of an operator.fpathConvert an absolute  to a normalized absolute dir .Throws: I when the supplied path:is not an absolute path contains a ..1 path component representing the parent directoryis not a valid path (See ‰)gpathConvert a relative  to a normalized relative dir .Throws: J 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 separatorshpathConvert an absolute  to a normalized absolute file .Throws: K 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?ipathConvert a relative  to a normalized relative file .Throws: L 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?jpath&Convert absolute path to directory to  type.kpath&Convert relative path to directory to  type.lpath!Convert absolute path to file to  type.mpath!Convert relative path to file to  type.npathMake a  S P.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).opathMake a  R P.ppathMake a  S Q.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).qpathMake a  R Q.Œpath7Normalizes directory path with platform-specific rules.pathVReplaces consecutive path seps with single sep and replaces alt sep with standard sep.Žpath™Normalizes 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.rpathSame as Y.spathSame as Z.`pathExtension to addpath Old file namepath9New file name with the desired extension added at the endapathExtension to addpath Old file namepath9New file name with the desired extension added at the endbpath Old file namepathExtension to addpath9New file name with the desired extension added at the endcpathExtension to setpath Old file namepath(New file name with the desired extensiondpathExtension to setpath Old file namepath(New file name with the desired extensionepath Old file namepathExtension to setpath(New file name with the desired extension/GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs/SRQPHIJKLMNOTUVWXYZ[\]`^_cfghijklmnopqGrsabdeX5b7e7’      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYOZQRSTUVWXY[!path-0.7.0-91Np1WF1N8MDj1zOTTXnHX Path.Internal Path.Posix Path.WindowsSystem.FilePathdropTrailingPathSeparatorPath relRootFP toFilePath hasParentDir $fLiftPath$fHashablePath$fToJSONKeyPath $fToJSONPath $fNFDataPath $fShowPath $fOrdPath$fEqPath $fDataPath $fGenericPathPathParseException PathException InvalidAbsDir InvalidRelDirInvalidAbsFileInvalidRelFileNotAProperPrefixHasNoExtensionInvalidExtensionDirFileRelAbsabsdirreldirabsfilerelfilestripProperPrefixisProperPrefixOfparentfilenamedirnamesplitExtension fileExtension addExtensionaddFileExtension<.>replaceExtensionsetFileExtension-<.> parseAbsDir parseRelDir parseAbsFile parseRelFile fromAbsDir fromRelDir fromAbsFile fromRelFilemkAbsDirmkRelDir mkAbsFile mkRelFilestripDir isParentOf$fFromJSONKeyPath$fFromJSONKeyPath0$fFromJSONPath$fFromJSONPath0$fFromJSONKeyPath1$fFromJSONKeyPath2$fFromJSONPath1$fFromJSONPath2$fExceptionPathException$fShowPathException$fEqPathExceptionbaseGHC.IOFilePathfilepath-1.4.2.1System.FilePath.PosixisValid validAbsFile validRelFile normalizeDirnormalizeAllSepsnormalizeWindowsSepsnormalizeLeadingSepsnormalizeTrailingSepsnormalizeFilePathSystem.FilePath.Windows