{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE NoImplicitPrelude #-}

module System.FilePath.FilePather.Posix(
  splitExtension
, takeExtension
, replaceExtension
, dropExtension
, addExtension
, hasExtension
, splitExtensions
, dropExtensions
, takeExtensions
, replaceExtensions
, isExtensionOf
, stripExtension
, splitFileName
, takeFileName
, replaceFileName
, dropFileName
, takeBaseName
, replaceBaseName
, takeDirectory
, replaceDirectory
, combine
, splitPath
, joinPath
, splitDirectories
, splitDrive
, joinDrive
, takeDrive
, hasDrive
, dropDrive
, isDrive
, hasTrailingPathSeparator
, addTrailingPathSeparator
, dropTrailingPathSeparator
, normalise
, equalFilePath
, makeRelative
, isRelative
, isAbsolute
, isValid
, makeValid
, module SFP
) where

import Control.Applicative ( Applicative )
import Control.Category((.))
import Control.Lens ( (#) )
import Data.String( String )
import Data.Bool( Bool )
import Data.Maybe ( Maybe )
import qualified System.FilePath.Posix as FP
import System.FilePath.Posix as SFP(FilePath, pathSeparator, pathSeparators, isPathSeparator, extSeparator, isExtSeparator, splitSearchPath, (-<.>), (</>))
import System.FilePath.FilePather.ToFilePath
    ( ToFilePath, toFilePath )
import System.FilePath.FilePather.ReadFilePath
    ( ReadFilePathT, liftReadFilePath )

splitExtension ::
  Applicative f =>
  ReadFilePathT f (String, String)
splitExtension :: ReadFilePathT f (String, String)
splitExtension =
  (String -> (String, String)) -> ReadFilePathT f (String, String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> (String, String)
FP.splitExtension

takeExtension ::
  Applicative f =>
  ReadFilePathT f String
takeExtension :: ReadFilePathT f String
takeExtension =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.takeExtension

replaceExtension ::
  Applicative f =>
  ReadFilePathT f (String -> FilePath)
replaceExtension :: ReadFilePathT f (String -> String)
replaceExtension =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.replaceExtension

dropExtension ::
  Applicative f =>
  ReadFilePathT f FilePath
dropExtension :: ReadFilePathT f String
dropExtension =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.dropExtensions

addExtension ::
  Applicative f =>
  ReadFilePathT f (String -> FilePath)
addExtension :: ReadFilePathT f (String -> String)
addExtension =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.addExtension

hasExtension ::
  Applicative f =>
  ReadFilePathT f Bool
hasExtension :: ReadFilePathT f Bool
hasExtension =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> Bool
FP.hasExtension

splitExtensions ::
  Applicative f =>
  ReadFilePathT f (FilePath, String)
splitExtensions :: ReadFilePathT f (String, String)
splitExtensions =
  (String -> (String, String)) -> ReadFilePathT f (String, String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> (String, String)
FP.splitExtensions

dropExtensions ::
  Applicative f =>
  ReadFilePathT f FilePath
dropExtensions :: ReadFilePathT f String
dropExtensions =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.dropExtensions

takeExtensions ::
  Applicative f =>
  ReadFilePathT f String
takeExtensions :: ReadFilePathT f String
takeExtensions =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.takeExtensions

replaceExtensions ::
  Applicative f =>
  ReadFilePathT f (String -> FilePath)
replaceExtensions :: ReadFilePathT f (String -> String)
replaceExtensions =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.replaceExtensions

isExtensionOf ::
  Applicative f =>
  String
  -> ReadFilePathT f Bool
isExtensionOf :: String -> ReadFilePathT f Bool
isExtensionOf =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath ((String -> Bool) -> ReadFilePathT f Bool)
-> (String -> String -> Bool) -> String -> ReadFilePathT f Bool
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> String -> Bool
FP.isExtensionOf

stripExtension ::
  Applicative f =>
  String
  -> ReadFilePathT f (Maybe FilePath)
stripExtension :: String -> ReadFilePathT f (Maybe String)
stripExtension =
  (String -> Maybe String) -> ReadFilePathT f (Maybe String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath ((String -> Maybe String) -> ReadFilePathT f (Maybe String))
-> (String -> String -> Maybe String)
-> String
-> ReadFilePathT f (Maybe String)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. String -> String -> Maybe String
FP.stripExtension

splitFileName ::
  Applicative f =>
  ReadFilePathT f (String, String)
splitFileName :: ReadFilePathT f (String, String)
splitFileName =
  (String -> (String, String)) -> ReadFilePathT f (String, String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> (String, String)
FP.splitFileName

takeFileName ::
  Applicative f =>
  ReadFilePathT f String
takeFileName :: ReadFilePathT f String
takeFileName =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.takeFileName

replaceFileName ::
  Applicative f =>
  ReadFilePathT f (String -> FilePath)
replaceFileName :: ReadFilePathT f (String -> String)
replaceFileName =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.replaceFileName

dropFileName ::
  Applicative f =>
  ReadFilePathT f FilePath
dropFileName :: ReadFilePathT f String
dropFileName =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.dropFileName

takeBaseName ::
  Applicative f =>
  ReadFilePathT f String
takeBaseName :: ReadFilePathT f String
takeBaseName =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.takeBaseName

replaceBaseName ::
  Applicative f =>
  ReadFilePathT f (String -> FilePath)
replaceBaseName :: ReadFilePathT f (String -> String)
replaceBaseName =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.replaceBaseName

takeDirectory ::
  Applicative f =>
  ReadFilePathT f FilePath
takeDirectory :: ReadFilePathT f String
takeDirectory =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.takeDirectory

replaceDirectory ::
  Applicative f =>
  ReadFilePathT f (String -> FilePath)
replaceDirectory :: ReadFilePathT f (String -> String)
replaceDirectory =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.replaceDirectory

combine ::
  Applicative f =>
  ReadFilePathT f (FilePath -> FilePath)
combine :: ReadFilePathT f (String -> String)
combine =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.combine

splitPath ::
  Applicative f =>
  ReadFilePathT f [FilePath]
splitPath :: ReadFilePathT f [String]
splitPath =
  (String -> [String]) -> ReadFilePathT f [String]
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> [String]
FP.splitPath

joinPath ::
  ToFilePath [FilePath]
joinPath :: ToFilePath [String]
joinPath =
  Tagged ([String] -> String) (Identity ([String] -> String))
-> Tagged (ToFilePath [String]) (Identity (ToFilePath [String]))
forall a a'.
Iso (ToFilePath a) (ToFilePath a') (a -> String) (a' -> String)
toFilePath (Tagged ([String] -> String) (Identity ([String] -> String))
 -> Tagged (ToFilePath [String]) (Identity (ToFilePath [String])))
-> ([String] -> String) -> ToFilePath [String]
forall t b. AReview t b -> b -> t
# [String] -> String
FP.joinPath

splitDirectories ::
  Applicative f =>
  ReadFilePathT f [FilePath]
splitDirectories :: ReadFilePathT f [String]
splitDirectories =
  (String -> [String]) -> ReadFilePathT f [String]
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> [String]
FP.splitDirectories

splitDrive ::
  Applicative f =>
  ReadFilePathT f (FilePath, FilePath)
splitDrive :: ReadFilePathT f (String, String)
splitDrive =
  (String -> (String, String)) -> ReadFilePathT f (String, String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> (String, String)
FP.splitDrive

joinDrive ::
  Applicative f =>
  ReadFilePathT f (FilePath -> FilePath)
joinDrive :: ReadFilePathT f (String -> String)
joinDrive =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.joinDrive

takeDrive ::
  Applicative f =>
  ReadFilePathT f FilePath
takeDrive :: ReadFilePathT f String
takeDrive =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.takeDrive

hasDrive ::
  Applicative f =>
  ReadFilePathT f Bool
hasDrive :: ReadFilePathT f Bool
hasDrive =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> Bool
FP.hasDrive

dropDrive ::
  Applicative f =>
  ReadFilePathT f FilePath
dropDrive :: ReadFilePathT f String
dropDrive =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.dropDrive

isDrive ::
  Applicative f =>
  ReadFilePathT f Bool
isDrive :: ReadFilePathT f Bool
isDrive =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> Bool
FP.isDrive

hasTrailingPathSeparator ::
  Applicative f =>
  ReadFilePathT f Bool
hasTrailingPathSeparator :: ReadFilePathT f Bool
hasTrailingPathSeparator =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> Bool
FP.hasTrailingPathSeparator

addTrailingPathSeparator ::
  Applicative f =>
  ReadFilePathT f FilePath
addTrailingPathSeparator :: ReadFilePathT f String
addTrailingPathSeparator =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.addTrailingPathSeparator

dropTrailingPathSeparator ::
  Applicative f =>
  ReadFilePathT f FilePath
dropTrailingPathSeparator :: ReadFilePathT f String
dropTrailingPathSeparator =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.dropTrailingPathSeparator

normalise ::
  Applicative f =>
  ReadFilePathT f FilePath
normalise :: ReadFilePathT f String
normalise =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.normalise

equalFilePath ::
  Applicative f =>
  ReadFilePathT f (FilePath -> Bool)
equalFilePath :: ReadFilePathT f (String -> Bool)
equalFilePath =
  (String -> String -> Bool) -> ReadFilePathT f (String -> Bool)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> Bool
FP.equalFilePath

makeRelative ::
  Applicative f =>
  ReadFilePathT f (FilePath -> FilePath)
makeRelative :: ReadFilePathT f (String -> String)
makeRelative =
  (String -> String -> String) -> ReadFilePathT f (String -> String)
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String -> String
FP.makeRelative

isRelative ::
  Applicative f =>
  ReadFilePathT f Bool
isRelative :: ReadFilePathT f Bool
isRelative =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> Bool
FP.isRelative

isAbsolute ::
  Applicative f =>
  ReadFilePathT f Bool
isAbsolute :: ReadFilePathT f Bool
isAbsolute =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> Bool
FP.isAbsolute

isValid ::
  Applicative f =>
  ReadFilePathT f Bool
isValid :: ReadFilePathT f Bool
isValid =
  (String -> Bool) -> ReadFilePathT f Bool
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> Bool
FP.isValid

makeValid ::
  Applicative f =>
  ReadFilePathT f FilePath
makeValid :: ReadFilePathT f String
makeValid =
  (String -> String) -> ReadFilePathT f String
forall (f :: * -> *) a.
Applicative f =>
(String -> a) -> ReadFilePathT f a
liftReadFilePath String -> String
FP.makeValid