pathtype-0.5.4.3: src/System/Path.hs
{-# 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