HOOGbs{./<>a $)1b ,,c  %++--d  !!%&-.22e )+1f ##))11g h  $$*+i !#%+-2jk,1l   #%+11m ##)),,11n   "#'),,/2o  !"$%'(--/022p +q r   &++-.s   ""$,/022t  !"$1u v&&..w22x  ""'(/0y!!--xxv!Ui()'->AllAnyArithExceptionArrayExceptionAsyncExceptionBoolf BufferModeT BufferStatePCCharCClockCDevCDoubleKCFloatCInoCIntbCIntMaxCIntPtrCLDoubleyCLLong1CLongCModeCOffYCPidCPtrdiffCSCharCShort9 CSigAtomicCSizeCSsizeaCTime/CUCharCUIntCUIntMaxWCUIntPtrCULLongCULongCUShort7CWcharChanCharComplex ConsoleEventxConstro ConstrRepfDataRep]DataTypeIDoubleDynamicE12E6Errno ExceptionExitCodeFDTypeFdRFixityIFloatGeneralCategoryHandle HandlePosn HandleTypeHashDataIO~ IOErrorTypeu IOExceptionlIOModeRId=Inserts9IntInt16Int32FInt64Int8IntPtr\IntegerLexemeMaybe Ordering P QSemv QSemNl ReadPS ReadPrec: STM! SeekMode StableName TVar ThreadId Timeout TyCon TypeRep Unique Version Weak Word> Word16 Word32 Word64K Word8 WordPtr ZipList [::] []?  TraversableFoldableMonadFix Applicative Alternative MonadPlusFunctorMonadFunctorMonadFunctor Applicative ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq PrintfArgStorableDataShowNumRealEnumIntegralBoundedIxReadBitsOrdEq PrintfArgStorableDataEqOrdNumEnumIntegralBitsShowRealBoundedIxRead PrintfArgStorableDataNumEnumIntegralBitsShowRealBoundedIxReadOrdEq PrintfArgStorableDataShowNumRealEnumIntegralBoundedIxReadBitsOrdEq PrintfArgStorableDataShowNumRealEnumIntegralBoundedIxReadBitsOrdEq Typeable1EqOrdShowReadTypeableOrdEqDataDataEqTypeableDataShowEqOrdTypeable Typeable1 Typeable1ShowReadEnumIxOrdEq Typeable1FunctorMonadFunctorMonad MonadPlusFunctorMonad MonadPlusTypeableTypeableMonad MonadPlus MonoidDataReadShowBoundedEnumIxOrdEq TraversableFoldableMonadFix Applicative AlternativeFunctorMonad MonadPlusShowEqRead PrintfArgBitsDataReadEqOrdNumEnumShowIxRealIntegral ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq PrintfArgStorableDataShowNumRealEnumIntegralBoundedIxReadBitsOrdEq PrintfArgStorableDataEqOrdShowNumEnumIntegralReadBitsRealBoundedIx PrintfArgStorableDataShowNumEnumIntegralReadBitsRealBoundedIxOrdEq PrintfArgStorableDataShowNumRealEnumIntegralBoundedIxReadBitsOrdEq PrintfArgBitsStorableDataReadShowNumBoundedEnumIxRealIntegralEqOrdEqFunctor ApplicativeShowReadEnumIxOrdEqEqShowEqShowMonadFix ApplicativeFunctorMonadShowEqShowEqShowDataEqShowIxBoundedShowReadEnumOrdEq PrintfArgStorableDataEqOrdNumReal FractionalRealFracFloating RealFloatShowEnumReadShowEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEqEqShowReadOrdEqShowEqEq HasResolution HasResolutionTypeableShow PrintfArgStorableDataEqOrdNumReal FractionalFloatingRealFrac RealFloatShowEnumReadTypeableDataShowShowEqShowEqShowEqReadShowEnumOrdEqTypeable Typeable1 PrintfArgIsCharStorableDataReadShowBoundedEnumIxEqOrd Typeable1 ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeable RealFloatRealFracFloating FractionalRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEq ReadShowTypeable RealFloatRealFracFloating FractionalRealStorableEnumNumOrdEq ReadShowTypeable RealFloatRealFracFloating FractionalRealStorableEnumNumOrdEq ReadShowTypeableRealStorableEnumNumOrdEq ReadShowTypeableRealStorableEnumNumOrdEq ReadShowTypeableBitsIntegralBoundedRealStorableEnumNumOrdEqEqShowReadOrdEq StorableDataReadShowBoundedEnumIxOrdEqShowOrdEqShowOrdEqShowOrdEqMonoidBoundedShowReadOrdEqMonoidBoundedShowReadOrdEqArrow ArrowChoice ArrowApply ArrowLoop MonoidDataReadShowBoundedEnumIxEqOrdY4 ByteCount!CDir!CDirent!CFLock!CGroup!CLconv!CPasswd! CSigactionz!CSigsetu!CStatp!CStringa! CStringLenF!CTermiosA!CTm*sE*aL*bS*lZ*ea* Traversablem*t*l*e*c*a*s*e*l*e*t*t*e*r*GeneralCategorye*e*x+p+i+r+e+d#+ IOErrorTyper;+eB+aI+dP+i+k\+ic+lj+lq+ex+d+AsyncExceptiond+ThreadId#+ ThreadId##c1a1e60h/p/t,ud,y+mC,s+t,e,m,e,r,r$,o+,r2, IOErrorTypebJ,oQ,lX,Lexemem,rp,rw,o~,g,a,t,e,GeneralCategorySumSTa-m-o-r,e]-i,n,g,Stringc+-r-e-p-DataRepo2-n9-s@-tG-rN- ConstrRepa-f-p-ts-STretSTRepSTRefm-FDTyper-a-b-l-e-StorableSTMb.cO.r).t .e.#.State#r0.a7.y>.STArraykV.o].vd.ek.rr.fy.l.o.w.AsyncExceptionl.e.n.p.t.r. StablePtr#. StablePtr#a.m/e / StableNamea&/c-/e/i9/n@/gG/cN/oU/m\/bc/ij/nq/ix/n/g/m/a/r/k/GeneralCategoryGeneralCategoryo 0u/t/d/o/w/n/ ConsoleEventw0Shows'0ShowSe0mB0iI0cP0lW0o^0se0el0ds0hz0a0n0d0l0e0 HandleTypek0f0m0o0d0e0SeekModer0o0m0e1n 1d1SeekModem&1p-1l41e;1vB1aI1rP1 SampleVarIntegera6e1i1g1h1t1Eithera4c3g3ln3q3s2t1u1r1n1i1n1o1r1d1e2r 2ArgOrdero"2u)2r02c72e>2b2e2vO2aV2n]2id2sk2hr2ey2d2 IOErrorTypex2h2a2u2s2t2e2d2 IOErrorTypeu2s2y2 IOErrorTypeaR3u 3i3r3e!3o(3r/3d63e=3rD3ArgOrderrY3g`3ArgDescrau3t|3i3v3e3s3e3e3k3SeekModeu3l3a3r3f3i3l3e3FDTypec4sP4u4p4d4e%4r,4r34o:4rA4 ExceptioneW4l^4ee4rl4rs4oz4r4 Exceptiono4n4e4r4r4o4r4 Exceptiondw5l4Realf#5w4o4r5l 5d5 RealWorldlO5r/5a65c=5RealFracoV5a]5td5 RealFloatReadb6h6mb6p.6s6w5r5i5t5e5h5m5o5d5e5IOModea5n5d6l6e6 HandleTypeReadSReadPrB6eI6cP6ReadPrecoi6dp6ew6IOModea6n6d6l6e6 HandleTypeu6f6f6e6r6 BufferStatetg7w6b17d7e 7v7i7c7e%7FDTypeu87f?7fF7eM7rT7 RawBufferLexemeix7o7Ration7a7l7Rationals7e7m7QSemn7QSemNa;em:iQ:o5:r=8t)8u8n8c8Lexemer08Ptre:iR9oN8c8d8t_8of8cm8ot8l{8e8r8r8o8r8 IOErrorTypeu8c8t8Producte8s8s8g9i8d8 ProcessIDr9o9u%9p,9i39d:9ProcessGroupIDn9v^9ae9tl9es9uz9s9e9GeneralCategoryt9f9a9t9y9p9e9 PrintfTyper9g9 PrintfArgc':f :i:x:FixityPreco<:lC:PoolcX:o_:Picort:m{:i:u:t:e:ArgOrders:s:i:o:n:d:e:n:i:e:d: IOErrorTyperw;t ;t;e;r";n);m0;a7;t>;cE;hL;fS;aZ;ia;lh; Exceptiona~;g;r;a;p;h;s;e;p;a;r;a;t;o;r;GeneralCategoryOpaqueb?p=r=tX<v<e!<r(<f/<l6<o=<wD<ArithExceptionh_<ef<rm<e=lS=n=p<s<y<m<b<o<l<GeneralCategoryu<n<c<t<u<a<t<i<o<n=GeneralCategoryu"=m)=b0=e7=r>=GeneralCategoryeZ=ta=th=eo=rv=GeneralCategoryr=r=o=r= IOErrorTyped=Orde=r=i=n=g=Orderinga>e>t>ak>d=>i!>o(>n/>OptDescreD>sK>cR>rY>OptDescrrr>gy>ArgDescrn>p>u>n>c>t>u>a>t>i>o>n>GeneralCategoryq>u>e?Opaquej?e#?c*?t1?ObjecteAof?uR?mY?NumaAbrAmAna@rF@s?t?a?h?i?n?g?Maybes?s?i?g?n?e?d?GeneralCategoryu@c @h@t@h @i'@n.@g5@ IOErrorTypeeM@pT@DataReps@tm@et@r{@m@i@n@a@t@i@o@n@ Exceptionp@a@c@i@n@g@m@a@rAkAGeneralCategorye$At+Ah2Ao9Ad@AeGArNArUAo\ArcA ExceptionuyAfAfAeArAiAnAgA BufferModerAgAArgDescrsAtAeAdAaAtBoBmBiBcBa#Bl*Bl1By8B ExceptionaDiDoCuBvbBaiBrpBMVar#BMVar#tBaBvBaBrB#BMutVar#bBlBeBaFCbByBtBeCaCrCrCaCy$C#+CMutableByteArray#rMCrTCa[CybC#iC MutableArray#dDnCaCoCiCdCMonoiddCMonadfCpClCuCsC MonadPlusiDx DMonadFixi%Df,Di3De:DrADlDsMDyTDm[DbbDoiDlpDGeneralCategoryeDtDtDeDrDGeneralCategorycDrDoDMicrot EyDbDeDMaybehEsEyEm&Eb-Eo4El;EGeneralCategoryaGeSGiFoyEtkEOrderingg[FsEwEeErEcEaEsEeElEeEtEtEeErEGeneralCategorysEoFfFpFrFeFc$Fi+Fs2Fi9Fo@FnGFArithExceptionobFfiFfpF ConsoleEventm6GnFeFbFsFeFpFaFrFaFtFoFrFGeneralCategoryuFfFfGe GrGiGnGg&G BufferModei=GtDGLimitfGtGxdGekGmrGeyGLexemetGeGrGnGuGmGbGeGrGGeneralCategorytGEithersGtGLastlHeHi!Hs(Hl/Hi6HKleisli#lHuSHsZHtaHMaybeInteger #%O1 O3N6N8NdNgNl NnxJoBIp.IsHxHIxc IsHtHrHiHnHgHIsStringhIaIrIIsCharr5IIPrIOaKJeImIrbIeiIfpIIORefoIdIeIIOModerIxIcIeIpItIiIoInI IOExceptionrIoJr JIOErrort!Jy(Jp/Je6J IOErrorTyperRJrYJa`JygJIOArrayaMd*MfMiLlLrLtKvJaJlJiJdJaJrJgJuJmJeJnJtJ IOErrorTypeInt #L1L3pL6EL87LcLezKp\KrAKeHKpOKDataReptcKrjKIntPtrgKrKrKuKpKtKeKdK IOErrorTypeeKrKaKlKIntegralrKIntegero LnLsLt!Lr(L ConstrRepInt84LLInt64#`LInt64#2wLInt326LInt16Int#:+::+:tLiLaLlLqLuLoLtLeLGeneralCategoryiMxMFixitye1Mx8Mo?MuFMtMMoTMf[MbbMoiMupMnwMd~MsMArrayExceptionpMpMrMoMpMrMiMaMtMeMtMyMpMeM IOErrorTypelNeNg!Na(Nl/No6Np=NeDNrKNaRNtYNi`NogNnnN IOErrorTypenNoNrNeNHandlereNnNtNLexeme#NInt84N#NInt642N#OInt326O#OInt16IntaOeOp?OrFOiMOnTOt[OfbOtiOypOpwOe~O HPrintfTypeaOpOoOvOeOrOfOlOoOwOAsyncExceptionnPrPsOh`Pr PePsPoPl&Pu-Pt4Pi;PoBPnIP HasResolutiontgPanPbuPl|PeP HashTabledPwPaPrPePfPaPuPlPtP IOErrorTypedPlPeQHandle_Qp`QrOQt&Qy-Qp4Qe;Q HandleTypeHandlerogQsnQiQnzQ HandlePosntQiQoQnQHandlePosition_QHandle__eRmRqQtQOrdering GenericQ' GenericM'n$Re+Rr2Ra(Si>RcERGeneric'SbSmRqRrRttRGenericT'R GenericT'GenericRGenericQ'R GenericQ'GenericM'R GenericM'GenericBGeneric'l/Sc6Sa=StDSeKSgRSoYSr`SygSGeneralCategory #tYaUYdYf3XiVlRUoRTrTuSnScSpStSrSFunPtrtSoSrSFunctora TcTtTi"To)Tn0Ta7Tl>T FractionallUr^TeTmjTaqTtxTGeneralCategoryiTgTnTpTtTrT ForeignPtrcToTnTtTeTnTtTsUForeignPtrContentsd$Ua+Ub2Ul9Ue@UFoldableoYUa`UtgUFloat#UcUiUrUeUpUDataRepnUgUFloatingoUnUsUtUrU ConstrRepFloat#lFWnzVr]VxVeGVi)Vt0Vy7VFixitydNVFixedsdVtkVFirstaVlViVqVuVoVtVeVGeneralCategoryzVeVrVe WpVtVrV FinalizerPtrnWvWpWt&Wr-WFinalizerEnvPtreMWhXiWmWoWphWaoWtvWh}WFilePathfWfWsWeWtW FileOffsetoWdWeWFileModedWFileIDa XnXdXl Xe'XHandleeXf|XgDXeKXnRXeYXr`XigXcnXFFFormatiXoXrXmXaXtXFFFormatxXeXdXFFFormatxXpXoXnXeXnYt YFFFormatFDFdt0Yy7Yp>YeEYFDTypel\YscYejYBoolFloat 1\6{\iO\n[o[pb[qM[rZxYcZiYtYcZeGZfZsYuYcYcYeYsYsZExitCodeaZiZl$Zu+Zr2Ze9ZExitCodexNZcUZe\ZpcZtjZiqZoxZnZ ExceptionoZdZeZExitCodeeZpZtZiZoZnZ ExceptionrZn7[o[r [c[a[l![l([ Exceptiono>[ErrnoOrderingEqoi[cp[hw[t~[i[m[e[ EpochTimef[Lexemec[d[u[m[Enumo[Endol[o\s \i\n\g\m%\a,\r3\k:\GeneralCategorytV\h]\ed\rk\EitherE62\E12#`a`e^i.^o]u]y\n\aZ]e]i\o\e\r\r\o\r] IOErrorTypex]c!]e(]p/]t6]i=]oD]nK] Exceptionma]ih]co]Dynamica]p]l]e]x]h]a]n]d]l]e]Handlel]Dualu]b]l^e^Double#^Double#r^v:^iA^dH^eO^bV^y]^zd^ek^rr^oy^ArithExceptione^c^t^o^r^y^FDTypea_cs_fJ_n_v^i^c^e^i^d_DeviceIDo_r!_m(_a/_l6_ArithExceptionaQ_uX_l__tf_Handleriz_m_a_l_n_u_m_b_e_r_GeneralCategoryd_l_o_c_k_ Exceptionsz`t `a`DataDatar[`t4`y;`pB`eI`DataTypeeb`pi`DataReph`p`u`n`c`t`u`a`t`i`o`n`GeneralCategoryDouble#lalc~ldkffkg:khjijjLjlhm~hofpesJdtcuawFacasRatYar`aigannaguaCWStringlaeana CWStringLenhaaaraCWcharcci;clbrbs\btai.bsbnbabmbebCUtsnamem5bbploonrnumymtme&maamc2mo9mu@mnGmtNm ByteCountrhmromavmy}m#m ByteArray#fmfmemrmBufferl-nmnsmtmamtmem BufferStateo ndnen BufferModei4ns;ntBn BufferListc~nn`nignlnn BufferListonnnsn BufferListenankn ConsoleEventoounnndnendnBoundedl oBoolooc&ok-oboe9od@oiooLonSodZoeaoahodoomvov}oaoro Exceptionnodoeofoionoiotoeoloyo Exceptionuofpf peprpi pn'pg.p BufferModetEpsLpBitsb vdultntptrSqspspypnpcpepxpcpeppptpipopnpAsyncExceptioneprptqi qoqnqf!qa(qi/ql6qe=qdDq Exceptiongsi4srdqaropqwwqArrowarcLrl$rmqpqzqeqrqoq ArrowZerolquqsq ArrowPlusoqnra rdr ArrowMonado+ro2rp9r ArrowLoophSroZriarchreor ArrowChoiceprprlryr ArrowApplyyrArray#$serxrcrerprtrirosn sArrayExceptionArray#t;shBseIsxPscWse^spestlsissozsnsArithExceptiondsosrsdsesrsArgOrderessscsrsArgDescrpteZtltitc"ta)tt0ti7tv>teEt Applicativenatdhthtmtto{tdtetIOModeatntdtltet HandleTypeytAnygulur?uttetrunuautuiuv#ue*u AlternativeeFuaMudTuy[uebuxiuipuswut~usu IOErrorTypeAllcurueupuDataRepounusuturu ConstrRepdvr v#vAddr#s'vo.vl5vu?FilePath2]G߃uI!߂c9oCwW/ Q!~~~]~9~ ~}}}e}=}}|||s|Y|windowse|Windows takefilename| takeFileNamebctakeextensions|takeExtensions`a takeextension| takeExtension^_ takedrive| takeDrive\] takedirectory%} takeDirectoryZ[ takebasenameN} takeBaseNameXYsplitsearchpathy}splitSearchPathVW splitpath} splitPathTU splitfilename} splitFileNameRSsplitextensions}splitExtensionsPQsplitextension ~splitExtensionNO splitdriveH~ splitDriveLMsplitdirectoriesr~splitDirectoriesJKsearchpathseparator~searchPathSeparatorHIreplacefilename~replaceFileNameFGreplaceextensionreplaceExtensionDEreplacedirectory6replaceDirectoryBCreplacebasenameereplaceBaseName@AposixPosixpathseparatorspathSeparators>? pathseparator pathSeparator<= normalise normalise:; makevalid makeValid89 makerelative@ makeRelative67joinpathdjoinPath45 joindrive joinDrive23isvalidisValid01issearchpathseparatorрisSearchPathSeparator./ isrelative isRelative,-ispathseparator)isPathSeparator*+isextseparatorVisExtSeparator()isdrive{isDrive&' isabsolute isAbsolute$%hastrailingpathseparator΁hasTrailingPathSeparator"# hasextension hasExtension !hasdrive&hasDrive getsearchpathK getSearchPathfilepathpFilePathfilepath extseparator extSeparator equalfilepathǂ equalFilePathdroptrailingpathseparatordropTrailingPathSeparator dropfilename2 dropFileNamedropextensions\dropExtensions dropextension dropExtension dropdrive dropDrivecombine̓combine addtrailingpathseparatoraddTrailingPathSeparator addextension0 addExtension O<.>e<.>cu+g!9 Qt }we7gAa39/%/LiJ+A_ly{rių˲ѱϰͯ,"e|s KŒ?>!:_ takeFileName takeFileName :: FilePath -> FilePaths\FilePathFilePathGet the file name.
takeFileName "test/" == ""
takeFileName x == snd (splitFileName x)
takeFileName (replaceFileName x "fred") == "fred"
takeFileName (combine x "fred") == "fred"
isRelative (takeFileName (makeValid x))
 takeFileName takeFileName :: FilePath -> FilePathˇFilePathFilePathGet the file name.
takeFileName "test/" == ""
takeFileName x == snd (splitFileName x)
takeFileName (replaceFileName x "fred") == "fred"
takeFileName (combine x "fred") == "fred"
isRelative (takeFileName (makeValid x))
takeExtensionstakeExtensions :: FilePath -> String#FilePathStringGet all extensions takeExtensionstakeExtensions :: FilePath -> StringFilePathStringGet all extensions  takeExtension takeExtension :: FilePath -> String'FilePathStringGet the extension of a file, returns "" for no extension, .ext otherwise.
takeExtension x == snd (splitExtension x)
takeExtension (addExtension x "ext") == ".ext"
takeExtension (replaceExtension x "ext") == ".ext"
 takeExtension takeExtension :: FilePath -> StringvFilePathStringGet the extension of a file, returns "" for no extension, .ext otherwise.
takeExtension x == snd (splitExtension x)
takeExtension (addExtension x "ext") == ".ext"
takeExtension (replaceExtension x "ext") == ".ext"
 takeDrive takeDrive :: FilePath -> FilePathԌFilePathFilePathOGet the drive from a filepath.
takeDrive x == fst (splitDrive x)
 takeDrive takeDrive :: FilePath -> FilePathFilePathFilePathOGet the drive from a filepath.
takeDrive x == fst (splitDrive x)
 takeDirectory takeDirectory :: FilePath -> FilePatheNFilePathFilePath2Get the directory name, move up one level.
Posix:    takeDirectory "/foo/bar/baz" == "/foo/bar"
Posix:    takeDirectory "/foo/bar/baz/" == "/foo/bar/baz"
Windows:  takeDirectory "foo\\bar" == "foo"
Windows:  takeDirectory "foo\\bar\\\\" == "foo\\bar"
Windows:  takeDirectory "C:\\" == "C:\\"
 takeDirectory takeDirectory :: FilePath -> FilePath FilePathFilePath2Get the directory name, move up one level.
Posix:    takeDirectory "/foo/bar/baz" == "/foo/bar"
Posix:    takeDirectory "/foo/bar/baz/" == "/foo/bar/baz"
Windows:  takeDirectory "foo\\bar" == "foo"
Windows:  takeDirectory "foo\\bar\\\\" == "foo\\bar"
Windows:  takeDirectory "C:\\" == "C:\\"
 takeBaseName takeBaseName :: FilePath -> StringFilePathStringGet the base name, without an extension or path.
takeBaseName "file/test.txt" == "test"
takeBaseName "dave.ext" == "dave"
takeBaseName "" == ""
takeBaseName "test" == "test"
takeBaseName (addTrailingPathSeparator x) == ""
takeBaseName "file/file.tar.gz" == "file.tar"
 takeBaseName takeBaseName :: FilePath -> String-FilePathStringGet the base name, without an extension or path.
takeBaseName "file/test.txt" == "test"
takeBaseName "dave.ext" == "dave"
takeBaseName "" == ""
takeBaseName "test" == "test"
takeBaseName (addTrailingPathSeparator x) == ""
takeBaseName "file/file.tar.gz" == "file.tar"
splitSearchPathsplitSearchPath :: String ->  [FilePath]String[]FilePathTake a string, split it on the searchPathSeparator character.
Windows: splitSearchPath "File1;File2;File3" == ["File1","File2","File3"]
Posix:   splitSearchPath "File1:File2:File3" == ["File1","File2","File3"]
splitSearchPathsplitSearchPath :: String ->  [FilePath]"String[]FilePathTake a string, split it on the searchPathSeparator character.
Windows: splitSearchPath "File1;File2;File3" == ["File1","File2","File3"]
Posix:   splitSearchPath "File1:File2:File3" == ["File1","File2","File3"]
 splitPath splitPath :: FilePath ->  [FilePath]{^FilePath[]FilePathASplit a path by the directory separator.
concat (splitPath x) == x
splitPath "test//item/" == ["test//","item/"]
splitPath "test/item/file" == ["test/","item/","file"]
splitPath "" == []
Windows: splitPath "c:\\test\\path" == ["c:\\","test\\","path"]
Posix:   splitPath "/file/test" == ["/","file/","test"]
 splitPath splitPath :: FilePath ->  [FilePath].FilePath[]FilePathASplit a path by the directory separator.
concat (splitPath x) == x
splitPath "test//item/" == ["test//","item/"]
splitPath "test/item/file" == ["test/","item/","file"]
splitPath "" == []
Windows: splitPath "c:\\test\\path" == ["c:\\","test\\","path"]
Posix:   splitPath "/file/test" == ["/","file/","test"]
 splitFileName splitFileName :: FilePath -> (String, String)ҚFilePath(,)StringStringSplit a filename into directory and file. combine is the inverse.
uncurry (++) (splitFileName x) == x
uncurry combine (splitFileName (makeValid x)) == (makeValid x)
splitFileName "file/bob.txt" == ("file/", "bob.txt")
splitFileName "file/" == ("file/", "")
splitFileName "bob" == ("", "bob")
Posix:   splitFileName "/" == ("/","")
Windows: splitFileName "c:" == ("c:","")
 splitFileName splitFileName :: FilePath -> (String, String)FilePath(,)StringStringSplit a filename into directory and file. combine is the inverse.
uncurry (++) (splitFileName x) == x
uncurry combine (splitFileName (makeValid x)) == (makeValid x)
splitFileName "file/bob.txt" == ("file/", "bob.txt")
splitFileName "file/" == ("file/", "")
splitFileName "bob" == ("", "bob")
Posix:   splitFileName "/" == ("/","")
Windows: splitFileName "c:" == ("c:","")
splitExtensionssplitExtensions :: FilePath -> (FilePath, String)FilePath(,)FilePathStringZSplit on all extensions
splitExtensions "file.tar.gz" == ("file",".tar.gz")
splitExtensionssplitExtensions :: FilePath -> (FilePath, String)FilePath(,)FilePathStringZSplit on all extensions
splitExtensions "file.tar.gz" == ("file",".tar.gz")
splitExtensionsplitExtension :: FilePath -> (String, String)ƠFilePath(,)StringString!Split on the extension. addExtension is the inverse.
uncurry (++) (splitExtension x) == x
uncurry addExtension (splitExtension x) == x
splitExtension "file.txt" == ("file",".txt")
splitExtension "file" == ("file","")
splitExtension "file/file.txt" == ("file/file",".txt")
splitExtension "file.txt/boris" == ("file.txt/boris","")
splitExtension "file.txt/boris.ext" == ("file.txt/boris",".ext")
splitExtension "file/path.txt.bob.fred" == ("file/path.txt.bob",".fred")
splitExtension "file/path.txt/" == ("file/path.txt/","")
splitExtensionsplitExtension :: FilePath -> (String, String)pFilePath(,)StringString!Split on the extension. addExtension is the inverse.
uncurry (++) (splitExtension x) == x
uncurry addExtension (splitExtension x) == x
splitExtension "file.txt" == ("file",".txt")
splitExtension "file" == ("file","")
splitExtension "file/file.txt" == ("file/file",".txt")
splitExtension "file.txt/boris" == ("file.txt/boris","")
splitExtension "file.txt/boris.ext" == ("file.txt/boris",".ext")
splitExtension "file/path.txt.bob.fred" == ("file/path.txt.bob",".fred")
splitExtension "file/path.txt/" == ("file/path.txt/","")
 splitDrive splitDrive :: FilePath -> (FilePath, FilePath)>FilePath(,)FilePathFilePathSplit a path into a drive and a path. On Unix, / is a Drive.
uncurry (++) (splitDrive x) == x
Windows: splitDrive "file" == ("","file")
Windows: splitDrive "c:/file" == ("c:/","file")
Windows: splitDrive "c:\\file" == ("c:\\","file")
Windows: splitDrive "\\\\shared\\test" == ("\\\\shared\\","test")
Windows: splitDrive "\\\\shared" == ("\\\\shared","")
Windows: splitDrive "\\\\?\\UNC\\shared\\file" == ("\\\\?\\UNC\\shared\\","file")
Windows: splitDrive "\\\\?\\d:\\file" == ("\\\\?\\d:\\","file")
Windows: splitDrive "/d" == ("/","d")
Posix:   splitDrive "/test" == ("/","test")
Posix:   splitDrive "//test" == ("//","test")
Posix:   splitDrive "test/file" == ("","test/file")
Posix:   splitDrive "file" == ("","file")
 splitDrive splitDrive :: FilePath -> (FilePath, FilePath)FilePath(,)FilePathFilePathSplit a path into a drive and a path. On Unix, / is a Drive.
uncurry (++) (splitDrive x) == x
Windows: splitDrive "file" == ("","file")
Windows: splitDrive "c:/file" == ("c:/","file")
Windows: splitDrive "c:\\file" == ("c:\\","file")
Windows: splitDrive "\\\\shared\\test" == ("\\\\shared\\","test")
Windows: splitDrive "\\\\shared" == ("\\\\shared","")
Windows: splitDrive "\\\\?\\UNC\\shared\\file" == ("\\\\?\\UNC\\shared\\","file")
Windows: splitDrive "\\\\?\\d:\\file" == ("\\\\?\\d:\\","file")
Windows: splitDrive "/d" == ("/","d")
Posix:   splitDrive "/test" == ("/","test")
Posix:   splitDrive "//test" == ("//","test")
Posix:   splitDrive "test/file" == ("","test/file")
Posix:   splitDrive "file" == ("","file")
splitDirectoriessplitDirectories :: FilePath ->  [FilePath]FilePath[]FilePath!Just as splitPath, but don't add the trailing slashes to each element.
splitDirectories "test/file" == ["test","file"]
splitDirectories "/test/file" == ["/","test","file"]
joinPath (splitDirectories (makeValid x)) `equalFilePath` makeValid x
splitDirectories "" == []
splitDirectoriessplitDirectories :: FilePath ->  [FilePath]FilePath[]FilePath!Just as splitPath, but don't add the trailing slashes to each element.
splitDirectories "test/file" == ["test","file"]
splitDirectories "/test/file" == ["/","test","file"]
joinPath (splitDirectories (makeValid x)) `equalFilePath` makeValid x
splitDirectories "" == []
searchPathSeparatorsearchPathSeparator :: CharCharThe character that is used to separate the entries in the $PATH environment variable.
Windows: searchPathSeparator == ';'
Posix:   searchPathSeparator == ':'
searchPathSeparatorsearchPathSeparator :: Char!CharThe character that is used to separate the entries in the $PATH environment variable.
Windows: searchPathSeparator == ';'
Posix:   searchPathSeparator == ':'
replaceFileNamereplaceFileName :: FilePath -> String -> FilePath]>FilePathStringFilePathjSet the filename.
replaceFileName (makeValid x) (takeFileName (makeValid x)) == makeValid x
replaceFileNamereplaceFileName :: FilePath -> String -> FilePathW8FilePathStringFilePathjSet the filename.
replaceFileName (makeValid x) (takeFileName (makeValid x)) == makeValid x
replaceExtensionreplaceExtension :: FilePath -> String -> FilePathS4FilePathStringFilePath@Set the extension of a file, overwriting one if already present.
replaceExtension "file.txt" ".bob" == "file.bob"
replaceExtension "file.txt" "bob" == "file.bob"
replaceExtension "file" ".bob" == "file.bob"
replaceExtension "file.txt" "" == "file"
replaceExtension "file.fred.bob" "txt" == "file.fred.txt"
replaceExtensionreplaceExtension :: FilePath -> String -> FilePath%FilePathStringFilePath@Set the extension of a file, overwriting one if already present.
replaceExtension "file.txt" ".bob" == "file.bob"
replaceExtension "file.txt" "bob" == "file.bob"
replaceExtension "file" ".bob" == "file.bob"
replaceExtension "file.txt" "" == "file"
replaceExtension "file.fred.bob" "txt" == "file.fred.txt"
replaceDirectoryreplaceDirectory :: FilePath -> String -> FilePathطFilePathStringFilePathwSet the directory, keeping the filename the same.
replaceDirectory x (takeDirectory x) `equalFilePath` x
replaceDirectoryreplaceDirectory :: FilePath -> String -> FilePathFilePathStringFilePathwSet the directory, keeping the filename the same.
replaceDirectory x (takeDirectory x) `equalFilePath` x
replaceBaseNamereplaceBaseName :: FilePath -> String -> FilePathFilePathStringFilePathSet the base name.
replaceBaseName "file/test.txt" "bob" == "file/bob.txt"
replaceBaseName "fred" "bill" == "bill"
replaceBaseName "/dave/fred/bob.gz.tar" "new" == "/dave/fred/new.tar"
replaceBaseName x (takeBaseName x) == x
replaceBaseNamereplaceBaseName :: FilePath -> String -> FilePathgFilePathStringFilePathSet the base name.
replaceBaseName "file/test.txt" "bob" == "file/bob.txt"
replaceBaseName "fred" "bill" == "bill"
replaceBaseName "/dave/fred/bob.gz.tar" "new" == "/dave/fred/new.tar"
replaceBaseName x (takeBaseName x) == x
pathSeparatorspathSeparators :: [Char]ɼ[]CharThe list of all possible separators.
Windows: pathSeparators == ['\\', '/']
Posix:   pathSeparators == ['/']
pathSeparator `elem` pathSeparators
pathSeparatorspathSeparators :: [Char][]CharThe list of all possible separators.
Windows: pathSeparators == ['\\', '/']
Posix:   pathSeparators == ['/']
pathSeparator `elem` pathSeparators
 pathSeparator pathSeparator :: CharCharThe character that separates directories. In the case where more than one character is possible, pathSeparator is the 'ideal' one.
Windows: pathSeparator == '\\'
Posix:   pathSeparator ==  '/'
isPathSeparator pathSeparator
 pathSeparator pathSeparator :: CharܿCharThe character that separates directories. In the case where more than one character is possible, pathSeparator is the 'ideal' one.
Windows: pathSeparator == '\\'
Posix:   pathSeparator ==  '/'
isPathSeparator pathSeparator
 normalise normalise :: FilePath -> FilePathA*FilePathFilePathvNormalise a file
Posix:   normalise "/file/\\test////" == "/file/\\test/"
Posix:   normalise "/file/./test" == "/file/test"
Posix:   normalise "/test/file/../bob/fred/" == "/test/file/../bob/fred/"
Posix:   normalise "../bob/fred/" == "../bob/fred/"
Posix:   normalise "./bob/fred/" == "bob/fred/"
Windows: normalise "c:\\file/bob\\" == "C:\\file\\bob\\"
Windows: normalise "c:\\" == "C:\\"
Windows: normalise "\\\\server\\test" == "\\\\server\\test"
Windows: normalise "c:/file" == "C:\\file"
 normalise normalise :: FilePath -> FilePath! FilePathFilePathvNormalise a file
Posix:   normalise "/file/\\test////" == "/file/\\test/"
Posix:   normalise "/file/./test" == "/file/test"
Posix:   normalise "/test/file/../bob/fred/" == "/test/file/../bob/fred/"
Posix:   normalise "../bob/fred/" == "../bob/fred/"
Posix:   normalise "./bob/fred/" == "bob/fred/"
Windows: normalise "c:\\file/bob\\" == "C:\\file\\bob\\"
Windows: normalise "c:\\" == "C:\\"
Windows: normalise "\\\\server\\test" == "\\\\server\\test"
Windows: normalise "c:/file" == "C:\\file"
 makeValid makeValid :: FilePath -> FilePathFilePathFilePathTake a FilePath and make it valid; does not change already valid FilePaths.
isValid (makeValid x)
if isValid x then makeValid x == x else True
Windows: makeValid "c:\\test:of_test" == "c:\\test_of_test"
Windows: makeValid "test*" == "test_"
Windows: makeValid "c:\\test\\nul" == "c:\\test\\nul_"
Windows: makeValid "c:\\test\\prn.txt" == "c:\\test\\prn_.txt"
Windows: makeValid "c:\\test/prn.txt" == "c:\\test/prn_.txt"
Windows: makeValid "c:\\nul\\file" == "c:\\nul_\\file"
 makeValid makeValid :: FilePath -> FilePathT=FilePathFilePathTake a FilePath and make it valid; does not change already valid FilePaths.
isValid (makeValid x)
if isValid x then makeValid x == x else True
Windows: makeValid "c:\\test:of_test" == "c:\\test_of_test"
Windows: makeValid "test*" == "test_"
Windows: makeValid "c:\\test\\nul" == "c:\\test\\nul_"
Windows: makeValid "c:\\test\\prn.txt" == "c:\\test\\prn_.txt"
Windows: makeValid "c:\\test/prn.txt" == "c:\\test/prn_.txt"
Windows: makeValid "c:\\nul\\file" == "c:\\nul_\\file"
 makeRelative makeRelative :: FilePath -> FilePath -> FilePathFilePathFilePathFilePathContract a filename, based on a relative path.
Windows: makeRelative x (x `combine` y) == y || takeDrive x == x
Posix:   makeRelative x (x `combine` y) == y
(isRelative x && makeRelative y x == x) || y `combine` makeRelative y x == x
Windows: makeRelative "C:\\Home" "c:\\home\\bob" == "bob"
Windows: makeRelative "C:\\Home" "D:\\Home\\Bob" == "D:\\Home\\Bob"
Posix:   makeRelative "/Home" "/home/bob" == "/home/bob"
Posix:   makeRelative "/home/" "/home/bob/foo/bar" == "bob/foo/bar"
Posix:   makeRelative "/fred" "bob" == "bob"
Posix:   makeRelative "/file/test" "/file/test/fred" == "fred"
Posix:   makeRelative "/file/test" "/file/test/fred/" == "fred/"
Posix:   makeRelative "some/path" "some/path/a/b/c" == "a/b/c"
 makeRelative makeRelative :: FilePath -> FilePath -> FilePath@FilePathFilePathFilePathContract a filename, based on a relative path.
Windows: makeRelative x (x `combine` y) == y || takeDrive x == x
Posix:   makeRelative x (x `combine` y) == y
(isRelative x && makeRelative y x == x) || y `combine` makeRelative y x == x
Windows: makeRelative "C:\\Home" "c:\\home\\bob" == "bob"
Windows: makeRelative "C:\\Home" "D:\\Home\\Bob" == "D:\\Home\\Bob"
Posix:   makeRelative "/Home" "/home/bob" == "/home/bob"
Posix:   makeRelative "/home/" "/home/bob/foo/bar" == "bob/foo/bar"
Posix:   makeRelative "/fred" "bob" == "bob"
Posix:   makeRelative "/file/test" "/file/test/fred" == "fred"
Posix:   makeRelative "/file/test" "/file/test/fred/" == "fred/"
Posix:   makeRelative "some/path" "some/path/a/b/c" == "a/b/c"
joinPathjoinPath ::  [FilePath] -> FilePathz[]FilePathFilePathJoin path elements back together.
joinPath (splitPath (makeValid x)) == makeValid x
joinPath [] == ""
Posix: joinPath ["test","file","path"] == "test/file/path"
joinPathjoinPath ::  [FilePath] -> FilePath[]FilePathFilePathJoin path elements back together.
joinPath (splitPath (makeValid x)) == makeValid x
joinPath [] == ""
Posix: joinPath ["test","file","path"] == "test/file/path"
 joinDrive joinDrive :: FilePath -> FilePath -> FilePathFilePathFilePathFilePath[Join a drive and the rest of the path.
uncurry joinDrive (splitDrive x) == x
 joinDrive joinDrive :: FilePath -> FilePath -> FilePathFilePathFilePathFilePath[Join a drive and the rest of the path.
uncurry joinDrive (splitDrive x) == x
isValidisValid :: FilePath -> BoolvFilePathBoolIs a FilePath valid, i.e. could you create a file like it?
Posix:   isValid "/random_ path:*" == True
Posix:   isValid x == True
Windows: isValid "c:\\test" == True
Windows: isValid "c:\\test:of_test" == False
Windows: isValid "test*" == False
Windows: isValid "c:\\test\\nul" == False
Windows: isValid "c:\\test\\prn.txt" == False
Windows: isValid "c:\\nul\\file" == False
isValidisValid :: FilePath -> BoolkXFilePathBoolIs a FilePath valid, i.e. could you create a file like it?
Posix:   isValid "/random_ path:*" == True
Posix:   isValid x == True
Windows: isValid "c:\\test" == True
Windows: isValid "c:\\test:of_test" == False
Windows: isValid "test*" == False
Windows: isValid "c:\\test\\nul" == False
Windows: isValid "c:\\test\\prn.txt" == False
Windows: isValid "c:\\nul\\file" == False
isSearchPathSeparatorisSearchPathSeparator :: Char -> BoolaRCharBoolgIs the character a file separator?
isSearchPathSeparator a == (a == searchPathSeparator)
isSearchPathSeparatorisSearchPathSeparator :: Char -> Bool:+CharBoolgIs the character a file separator?
isSearchPathSeparator a == (a == searchPathSeparator)
 isRelative isRelative :: FilePath -> BoolFilePathBoolIs a path relative, or is it fixed to the root?
Windows: isRelative "path\\test" == True
Windows: isRelative "c:\\test" == False
Posix:   isRelative "test/path" == True
Posix:   isRelative "/test" == False
 isRelative isRelative :: FilePath -> BoolE2FilePathBoolIs a path relative, or is it fixed to the root?
Windows: isRelative "path\\test" == True
Windows: isRelative "c:\\test" == False
Posix:   isRelative "test/path" == True
Posix:   isRelative "/test" == False
isPathSeparatorisPathSeparator :: Char -> BoolxCharBoolRather than using (== pathSeparator), use this. Test if something is a path separator.
isPathSeparator a == (a `elem` pathSeparators)
isPathSeparatorisPathSeparator :: Char -> BoolCharBoolRather than using (== pathSeparator), use this. Test if something is a path separator.
isPathSeparator a == (a `elem` pathSeparators)
isExtSeparatorisExtSeparator :: Char -> BoolCharBool_Is the character an extension character?
isExtSeparator a == (a == extSeparator)
isExtSeparatorisExtSeparator :: Char -> Bool\MCharBool_Is the character an extension character?
isExtSeparator a == (a == extSeparator)
isDriveisDrive :: FilePath -> BoolFilePathBoolIs an element a drive isDriveisDrive :: FilePath -> BoolzFilePathBoolIs an element a drive  isAbsolute isAbsolute :: FilePath -> BoolFilePathBoolV
not . isRelative
isAbsolute x == not (isRelative x)
 isAbsolute isAbsolute :: FilePath -> BoolFilePathBoolV
not . isRelative
isAbsolute x == not (isRelative x)
hasTrailingPathSeparatorhasTrailingPathSeparator :: FilePath -> BoolFilePathBoolIs an item either a directory or the last character a path separator?
hasTrailingPathSeparator "test" == False
hasTrailingPathSeparator "test/" == True
hasTrailingPathSeparatorhasTrailingPathSeparator :: FilePath -> BoolFilePathBoolIs an item either a directory or the last character a path separator?
hasTrailingPathSeparator "test" == False
hasTrailingPathSeparator "test/" == True
 hasExtension hasExtension :: FilePath -> BoolFilePathBoolhDoes the given filename have an extension?
null (takeExtension x) == not (hasExtension x)
 hasExtension hasExtension :: FilePath -> BoolFilePathBoolhDoes the given filename have an extension?
null (takeExtension x) == not (hasExtension x)
hasDrivehasDrive :: FilePath -> BoolcPFilePathBoolODoes a path have a drive.
not (hasDrive x) == null (takeDrive x)
hasDrivehasDrive :: FilePath -> BoolFilePathBoolODoes a path have a drive.
not (hasDrive x) == null (takeDrive x)
 getSearchPath getSearchPath ::  IO [FilePath]IO[]FilePath&Get a list of filepaths in the $PATH.  getSearchPath getSearchPath ::  IO [FilePath]M6IO[]FilePath&Get a list of filepaths in the $PATH.  extSeparator extSeparator :: CharChar;File extension character
extSeparator == '.'
 extSeparator extSeparator :: Char>7Char;File extension character
extSeparator == '.'
 equalFilePath equalFilePath :: FilePath -> FilePath -> BoolFilePathFilePathBoolEquality of two FilePaths. If you call System.Directory.canonicalizePath first this has a much better chance of working. Note that this doesn't follow symlinks or DOSNAM~1s.  equalFilePath equalFilePath :: FilePath -> FilePath -> BoolG*FilePathFilePathBoolEquality of two FilePaths. If you call System.Directory.canonicalizePath first this has a much better chance of working. Note that this doesn't follow symlinks or DOSNAM~1s. dropTrailingPathSeparatordropTrailingPathSeparator :: FilePath -> FilePathxFilePathFilePathRemove any trailing path separators
dropTrailingPathSeparator "file/test/" == "file/test"
not (hasTrailingPathSeparator (dropTrailingPathSeparator x)) || isDrive x
Posix:    dropTrailingPathSeparator "/" == "/"
dropTrailingPathSeparatordropTrailingPathSeparator :: FilePath -> FilePathFilePathFilePathRemove any trailing path separators
dropTrailingPathSeparator "file/test/" == "file/test"
not (hasTrailingPathSeparator (dropTrailingPathSeparator x)) || isDrive x
Posix:    dropTrailingPathSeparator "/" == "/"
 dropFileName dropFileName :: FilePath -> FilePathK4FilePathFilePathIDrop the filename.
dropFileName x == fst (splitFileName x)
 dropFileName dropFileName :: FilePath -> FilePathFilePathFilePathIDrop the filename.
dropFileName x == fst (splitFileName x)
dropExtensionsdropExtensions :: FilePath -> FilePathFilePathFilePathHDrop all extensions
not $ hasExtension (dropExtensions x)
dropExtensionsdropExtensions :: FilePath -> FilePath}fFilePathFilePathHDrop all extensions
not $ hasExtension (dropExtensions x)
 dropExtension dropExtension :: FilePath -> FilePath7 FilePathFilePathiRemove last extension, and the "." preceding it.
dropExtension x == fst (splitExtension x)
 dropExtension dropExtension :: FilePath -> FilePathFilePathFilePathiRemove last extension, and the "." preceding it.
dropExtension x == fst (splitExtension x)
 dropDrive dropDrive :: FilePath -> FilePathFilePathFilePathPDelete the drive, if it exists.
dropDrive x == snd (splitDrive x)
 dropDrive dropDrive :: FilePath -> FilePathFilePathFilePathPDelete the drive, if it exists.
dropDrive x == snd (splitDrive x)
combinecombine :: FilePath -> FilePath -> FilePathsRFilePathFilePathFilePathBCombine two paths, if the second path isAbsolute, then it returns the second.
combine (takeDirectory (makeValid x)) (takeFileName (makeValid x)) `equalFilePath` makeValid x
Posix:   combine "/" "test" == "/test"
Posix:   combine "home" "bob" == "home/bob"
Windows: combine "home" "bob" == "home\\bob"
combinecombine :: FilePath -> FilePath -> FilePath9FilePathFilePathFilePathBCombine two paths, if the second path isAbsolute, then it returns the second.
combine (takeDirectory (makeValid x)) (takeFileName (makeValid x)) `equalFilePath` makeValid x
Posix:   combine "/" "test" == "/test"
Posix:   combine "home" "bob" == "home/bob"
Windows: combine "home" "bob" == "home\\bob"
addTrailingPathSeparatoraddTrailingPathSeparator :: FilePath -> FilePathFilePathFilePathAdd a trailing file path separator if one is not already present.
hasTrailingPathSeparator (addTrailingPathSeparator x)
if hasTrailingPathSeparator x then addTrailingPathSeparator x == x else True
Posix:    addTrailingPathSeparator "test/rest" == "test/rest/"
addTrailingPathSeparatoraddTrailingPathSeparator :: FilePath -> FilePathFilePathFilePathAdd a trailing file path separator if one is not already present.
hasTrailingPathSeparator (addTrailingPathSeparator x)
if hasTrailingPathSeparator x then addTrailingPathSeparator x == x else True
Posix:    addTrailingPathSeparator "test/rest" == "test/rest/"
 addExtension addExtension :: FilePath -> String -> FilePath9FilePathStringFilePathAdd an extension, even if there is already one there. E.g. addExtension "foo.txt" "bat" -> "foo.txt.bat".
addExtension "file.txt" "bib" == "file.txt.bib"
addExtension "file." ".bib" == "file..bib"
addExtension "file" ".bib" == "file.bib"
addExtension "/" "x" == "/.x"
takeFileName (addExtension (addTrailingPathSeparator x) "ext") == ".ext"
Windows: addExtension "\\\\share" ".txt" == "\\\\share\\.txt"
 addExtension addExtension :: FilePath -> String -> FilePathpQFilePathStringFilePathAdd an extension, even if there is already one there. E.g. addExtension "foo.txt" "bat" -> "foo.txt.bat".
addExtension "file.txt" "bib" == "file.txt.bib"
addExtension "file." ".bib" == "file..bib"
addExtension "file" ".bib" == "file.bib"
addExtension "/" "x" == "/.x"
takeFileName (addExtension (addTrailingPathSeparator x) "ext") == ".ext"
Windows: addExtension "\\\\share" ".txt" == "\\\\share\\.txt"
 () :: FilePath -> FilePath -> FilePath~FilePathFilePathFilePath!A nice alias for combine.  () :: FilePath -> FilePath -> FilePathB!FilePathFilePathFilePath!A nice alias for combine. <.> (<.>) :: FilePath -> String -> FilePathFilePathStringFilePathFAlias to addExtension, for people who like that sort of thing. <.> (<.>) :: FilePath -> String -> FilePathFilePathStringFilePathFAlias to addExtension, for people who like that sort of thing. Windowsmodule System.FilePath.Windows+A library for FilePath manipulations, using Windows style paths on all platforms. Importing System.FilePath is usually better. Posixmodule System.FilePath.PosixA library for FilePath manipulations, using Posix style paths on all platforms. Importing System.FilePath is usually better. filepathpackage filepath{Library for manipulating FilePath's in a cross platform way. Library for manipulating FilePath's in a cross platform way. FilePathmodule System.FilePathT A library for FilePath manipulations, using Posix or Windows filepaths depending on the platform. Both System.FilePath.Posix and System.FilePath.Windows provide the same interface. See either for examples and a list of the available functions. rSystemFilePathPosixSystemFilePathWindowsSystemFilePathfilepath1.1.0.0Fhttp://hackage.haskell.org/packages/archive/filepath/1.1.0.0/doc/html/Chttp://hackage.haskell.org/cgi-bin/hackage-scripts/package/filepath