shake-0.0: Development/Shake/FilePath.hs
-- | Module for 'FilePath' operations, to be used in place of
-- "System.FilePath". It uses @\/@ as the directory separator to ensure
-- uniqueness, and squashes any @\/.\/@ components.
module Development.Shake.FilePath(
module System.FilePath.Posix,
dropDirectory1, takeDirectory1, normalise,
toNative, (</>), combine,
) where
import System.FilePath.Posix hiding (normalise, (</>), combine)
import qualified System.FilePath.Posix as Posix
import qualified System.FilePath as Native
-- | Drop the first directory from a 'FilePath'. Should only be used on
-- relative paths.
--
-- > dropDirectory1 "aaa/bbb" == "bbb"
-- > dropDirectory1 "aaa/" == ""
-- > dropDirectory1 "aaa" == ""
-- > dropDirectory1 "" == ""
dropDirectory1 :: FilePath -> FilePath
dropDirectory1 = drop 1 . dropWhile (not . isPathSeparator)
-- | Take the first component of a 'FilePath'. Should only be used on
-- relative paths.
--
-- > takeDirectory1 "aaa/bbb" == "aaa"
-- > takeDirectory1 "aaa/" == "aaa"
-- > takeDirectory1 "aaa" == "aaa"
takeDirectory1 :: FilePath -> FilePath
takeDirectory1 = takeWhile (not . isPathSeparator)
normalise :: FilePath -> FilePath
normalise = map (\x -> if x == '\\' then '/' else x)
toNative :: FilePath -> FilePath
toNative = map (\x -> if x == '/' then Native.pathSeparator else x)
(</>) :: FilePath -> FilePath -> FilePath
(</>) = combine
combine :: FilePath -> FilePath -> FilePath
combine x ('.':'.':'/':y) = combine (takeDirectory x) y
combine x y = Posix.combine x y