{-# LANGUAGE CPP #-} -- | This module provides type-safe access to filepath manipulations. -- -- It is designed to be imported instead of "System.FilePath". -- (It is intended to provide versions of functions from that -- module which have equivalent functionality but are more -- typesafe). "System.Path.Directory" is a companion module -- providing a type-safe alternative to "System.Directory". -- -- The heart of this module is the @'Path' ar fd@ abstract type which -- represents file and directory paths. The idea is that there are -- two phantom type parameters - the first should be 'Abs' or 'Rel', -- and the second 'File' or 'Dir'. A number of type synonyms are -- provided for common types: -- -- > type AbsFile = Path Abs File -- > type RelFile = Path Rel File -- > type AbsDir = Path Abs Dir -- > type RelDir = Path Rel Dir -- > -- > type AbsPath fd = Path Abs fd -- > type RelPath fd = Path Rel fd -- > type FilePath ar = Path ar File -- > type DirPath ar = Path ar Dir -- -- The type of the 'combine' (aka '</>') function gives the idea: -- -- > (</>) :: DirPath ar -> RelPath fd -> Path ar fd -- -- Together this enables us to give more meaningful types to -- a lot of the functions, and (hopefully) catch a bunch more -- errors at compile time. -- -- Overloaded string literals are supported, so with the @OverloadedStrings@ -- extension enabled, you can: -- -- > f :: FilePath ar -- > f = "tmp" </> "someFile" <.> "ext" -- -- If you don't want to use @OverloadedStrings@, you can use the construction fns: -- -- > f :: FilePath ar -- > f = asDirPath "tmp" </> asFilePath "someFile" <.> "ext" -- -- or... -- -- > f :: FilePath ar -- > f = asPath "tmp" </> asPath "someFile" <.> "ext" -- -- or just... -- -- > f :: FilePath ar -- > f = asPath "tmp/someFile.ext" -- -- One point to note is that whether one of these is interpreted as -- an absolute or a relative path depends on the type at which it is -- used: -- -- > *System.Path> f :: AbsFile -- > /tmp/someFile.ext -- > *System.Path> f :: RelFile -- > tmp/someFile.ext -- -- You will typically want to import as follows: -- -- > import Prelude hiding (FilePath) -- > import System.Path -- > import System.Path.Directory -- > import System.Path.IO -- -- The basic API (and properties satisfied) are heavily influenced -- by Neil Mitchell's "System.FilePath" module. -- -- -- Ben Moseley - (c) 2009-2010 -- #if defined(mingw32_HOST_OS) || defined(__MINGW32__) module System.Path(module System.Path.Windows) where import System.Path.Windows #else module System.Path(module System.Path.Posix) where import System.Path.Posix #endif