{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveLift #-}

module StrongPath.Internal
  ( Path (..),
    RelPathPrefix (..),
    Abs,
    Rel,
    Dir,
    File,
    Posix,
    Windows,
    System,
    Path',
    File',
    Dir',
    Rel',
    parseRelFileFP,
    parseRelDirFP,
    impossible,
    prefixNumParentDirs,
    relPathNumParentDirs,
    relPathPrefix,
    extractRelPathPrefix,
  )
where

import Control.Monad.Catch (MonadThrow, throwM)
import Data.Data (Data)
import Language.Haskell.TH.Syntax (Lift)
import qualified Path as P
import qualified Path.Posix as PP
import qualified Path.Windows as PW

-- | Strongly typed file path. Central type of the "StrongPath".
--
--   [@s@]: __Standard__: Posix or windows. Can be fixed ('Posix', 'Windows') or determined by the system ('System').
--
--   [@b@]: __Base__: Absolute ('Abs') or relative ('Rel').
--
--   [@t@]: __Type__: File ('File') or directory ('Dir').
--
-- Some examples:
--
-- > Path System (Dir HomeDir) (File FooFile)
-- > Path System Abs (Dir HomeDir)
-- > Path Posix (Rel ProjectRoot) (File ())
data Path s b t
  = -- NOTE: Relative paths can be sometimes be tricky when being reasoned about in the internal library code,
    --   when reconstructing them and working with them, due to RelPathPrefix and edge cases like ".", "..".
    --
    --   For example if original relative path was "..", we will parse it into RelDir "." ParentDir 1.
    --   Then it is important to be aware that this should be regarded as "..", and not "../.".
    --   In some functions like `basename` it is important to be aware of this.
    --
    --   Also, Path.Path can't hold empty path, so we can count on paths not to be empty.
    --
    --   And Path.Path can't store "." as file, only as dir, so that is also good to know.
    --
    --   I wonder if we could find a better way to represent path internaly, a way which would encode
    --   tricky situations explicitly, or maybe some kind of lower-level interface around it that would encode
    --   things like "paths can't be empty", "dir can be '.' but file can't", and similar.
    --   But maybe the solution would just be too complicated.
    -- System
    RelDir (P.Path P.Rel P.Dir) RelPathPrefix
  | RelFile (P.Path P.Rel P.File) RelPathPrefix
  | AbsDir (P.Path P.Abs P.Dir)
  | AbsFile (P.Path P.Abs P.File)
  | -- Windows
    RelDirW (PW.Path PW.Rel PW.Dir) RelPathPrefix
  | RelFileW (PW.Path PW.Rel PW.File) RelPathPrefix
  | AbsDirW (PW.Path PW.Abs PW.Dir)
  | AbsFileW (PW.Path PW.Abs PW.File)
  | -- Posix
    RelDirP (PP.Path PP.Rel PP.Dir) RelPathPrefix
  | RelFileP (PP.Path PP.Rel PP.File) RelPathPrefix
  | AbsDirP (PP.Path PP.Abs PP.Dir)
  | AbsFileP (PP.Path PP.Abs PP.File)
  deriving (Int -> Path s b t -> ShowS
[Path s b t] -> ShowS
Path s b t -> String
(Int -> Path s b t -> ShowS)
-> (Path s b t -> String)
-> ([Path s b t] -> ShowS)
-> Show (Path s b t)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall s b t. Int -> Path s b t -> ShowS
forall s b t. [Path s b t] -> ShowS
forall s b t. Path s b t -> String
showList :: [Path s b t] -> ShowS
$cshowList :: forall s b t. [Path s b t] -> ShowS
show :: Path s b t -> String
$cshow :: forall s b t. Path s b t -> String
showsPrec :: Int -> Path s b t -> ShowS
$cshowsPrec :: forall s b t. Int -> Path s b t -> ShowS
Show, Path s b t -> Path s b t -> Bool
(Path s b t -> Path s b t -> Bool)
-> (Path s b t -> Path s b t -> Bool) -> Eq (Path s b t)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall s b t. Path s b t -> Path s b t -> Bool
/= :: Path s b t -> Path s b t -> Bool
$c/= :: forall s b t. Path s b t -> Path s b t -> Bool
== :: Path s b t -> Path s b t -> Bool
$c== :: forall s b t. Path s b t -> Path s b t -> Bool
Eq, Path s b t -> Q Exp
Path s b t -> Q (TExp (Path s b t))
(Path s b t -> Q Exp)
-> (Path s b t -> Q (TExp (Path s b t))) -> Lift (Path s b t)
forall s b t. Path s b t -> Q Exp
forall s b t. Path s b t -> Q (TExp (Path s b t))
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Path s b t -> Q (TExp (Path s b t))
$cliftTyped :: forall s b t. Path s b t -> Q (TExp (Path s b t))
lift :: Path s b t -> Q Exp
$clift :: forall s b t. Path s b t -> Q Exp
Lift, Typeable (Path s b t)
DataType
Constr
Typeable (Path s b t)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Path s b t -> c (Path s b t))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (Path s b t))
-> (Path s b t -> Constr)
-> (Path s b t -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (Path s b t)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (Path s b t)))
-> ((forall b. Data b => b -> b) -> Path s b t -> Path s b t)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Path s b t -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Path s b t -> r)
-> (forall u. (forall d. Data d => d -> u) -> Path s b t -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> Path s b t -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t))
-> Data (Path s b t)
Path s b t -> DataType
Path s b t -> Constr
(forall b. Data b => b -> b) -> Path s b t -> Path s b t
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Path s b t -> c (Path s b t)
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Path s b t)
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Path s b t -> u
forall u. (forall d. Data d => d -> u) -> Path s b t -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
forall s b t. (Data s, Data b, Data t) => Typeable (Path s b t)
forall s b t. (Data s, Data b, Data t) => Path s b t -> DataType
forall s b t. (Data s, Data b, Data t) => Path s b t -> Constr
forall s b t.
(Data s, Data b, Data t) =>
(forall b. Data b => b -> b) -> Path s b t -> Path s b t
forall s b t u.
(Data s, Data b, Data t) =>
Int -> (forall d. Data d => d -> u) -> Path s b t -> u
forall s b t u.
(Data s, Data b, Data t) =>
(forall d. Data d => d -> u) -> Path s b t -> [u]
forall s b t r r'.
(Data s, Data b, Data t) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
forall s b t r r'.
(Data s, Data b, Data t) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
forall s b t (m :: * -> *).
(Data s, Data b, Data t, Monad m) =>
(forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
forall s b t (m :: * -> *).
(Data s, Data b, Data t, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
forall s b t (c :: * -> *).
(Data s, Data b, Data t) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Path s b t)
forall s b t (c :: * -> *).
(Data s, Data b, Data t) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Path s b t -> c (Path s b t)
forall s b t (t :: * -> *) (c :: * -> *).
(Data s, Data b, Data t, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Path s b t))
forall s b t (t :: * -> * -> *) (c :: * -> *).
(Data s, Data b, Data t, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Path s b t))
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Path s b t)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Path s b t -> c (Path s b t)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Path s b t))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Path s b t))
$cAbsFileP :: Constr
$cAbsDirP :: Constr
$cRelFileP :: Constr
$cRelDirP :: Constr
$cAbsFileW :: Constr
$cAbsDirW :: Constr
$cRelFileW :: Constr
$cRelDirW :: Constr
$cAbsFile :: Constr
$cAbsDir :: Constr
$cRelFile :: Constr
$cRelDir :: Constr
$tPath :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
$cgmapMo :: forall s b t (m :: * -> *).
(Data s, Data b, Data t, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
gmapMp :: (forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
$cgmapMp :: forall s b t (m :: * -> *).
(Data s, Data b, Data t, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
gmapM :: (forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
$cgmapM :: forall s b t (m :: * -> *).
(Data s, Data b, Data t, Monad m) =>
(forall d. Data d => d -> m d) -> Path s b t -> m (Path s b t)
gmapQi :: Int -> (forall d. Data d => d -> u) -> Path s b t -> u
$cgmapQi :: forall s b t u.
(Data s, Data b, Data t) =>
Int -> (forall d. Data d => d -> u) -> Path s b t -> u
gmapQ :: (forall d. Data d => d -> u) -> Path s b t -> [u]
$cgmapQ :: forall s b t u.
(Data s, Data b, Data t) =>
(forall d. Data d => d -> u) -> Path s b t -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
$cgmapQr :: forall s b t r r'.
(Data s, Data b, Data t) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
$cgmapQl :: forall s b t r r'.
(Data s, Data b, Data t) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Path s b t -> r
gmapT :: (forall b. Data b => b -> b) -> Path s b t -> Path s b t
$cgmapT :: forall s b t.
(Data s, Data b, Data t) =>
(forall b. Data b => b -> b) -> Path s b t -> Path s b t
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Path s b t))
$cdataCast2 :: forall s b t (t :: * -> * -> *) (c :: * -> *).
(Data s, Data b, Data t, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Path s b t))
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c (Path s b t))
$cdataCast1 :: forall s b t (t :: * -> *) (c :: * -> *).
(Data s, Data b, Data t, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Path s b t))
dataTypeOf :: Path s b t -> DataType
$cdataTypeOf :: forall s b t. (Data s, Data b, Data t) => Path s b t -> DataType
toConstr :: Path s b t -> Constr
$ctoConstr :: forall s b t. (Data s, Data b, Data t) => Path s b t -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Path s b t)
$cgunfold :: forall s b t (c :: * -> *).
(Data s, Data b, Data t) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Path s b t)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Path s b t -> c (Path s b t)
$cgfoldl :: forall s b t (c :: * -> *).
(Data s, Data b, Data t) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Path s b t -> c (Path s b t)
$cp1Data :: forall s b t. (Data s, Data b, Data t) => Typeable (Path s b t)
Data)

data RelPathPrefix
  = -- | ../, Int saying how many times it repeats.
    ParentDir Int
  | NoPrefix
  deriving (Int -> RelPathPrefix -> ShowS
[RelPathPrefix] -> ShowS
RelPathPrefix -> String
(Int -> RelPathPrefix -> ShowS)
-> (RelPathPrefix -> String)
-> ([RelPathPrefix] -> ShowS)
-> Show RelPathPrefix
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RelPathPrefix] -> ShowS
$cshowList :: [RelPathPrefix] -> ShowS
show :: RelPathPrefix -> String
$cshow :: RelPathPrefix -> String
showsPrec :: Int -> RelPathPrefix -> ShowS
$cshowsPrec :: Int -> RelPathPrefix -> ShowS
Show, RelPathPrefix -> RelPathPrefix -> Bool
(RelPathPrefix -> RelPathPrefix -> Bool)
-> (RelPathPrefix -> RelPathPrefix -> Bool) -> Eq RelPathPrefix
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RelPathPrefix -> RelPathPrefix -> Bool
$c/= :: RelPathPrefix -> RelPathPrefix -> Bool
== :: RelPathPrefix -> RelPathPrefix -> Bool
$c== :: RelPathPrefix -> RelPathPrefix -> Bool
Eq, RelPathPrefix -> Q Exp
RelPathPrefix -> Q (TExp RelPathPrefix)
(RelPathPrefix -> Q Exp)
-> (RelPathPrefix -> Q (TExp RelPathPrefix)) -> Lift RelPathPrefix
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: RelPathPrefix -> Q (TExp RelPathPrefix)
$cliftTyped :: RelPathPrefix -> Q (TExp RelPathPrefix)
lift :: RelPathPrefix -> Q Exp
$clift :: RelPathPrefix -> Q Exp
Lift, Typeable RelPathPrefix
DataType
Constr
Typeable RelPathPrefix
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> RelPathPrefix -> c RelPathPrefix)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c RelPathPrefix)
-> (RelPathPrefix -> Constr)
-> (RelPathPrefix -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c RelPathPrefix))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c RelPathPrefix))
-> ((forall b. Data b => b -> b) -> RelPathPrefix -> RelPathPrefix)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r)
-> (forall u. (forall d. Data d => d -> u) -> RelPathPrefix -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> RelPathPrefix -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix)
-> Data RelPathPrefix
RelPathPrefix -> DataType
RelPathPrefix -> Constr
(forall b. Data b => b -> b) -> RelPathPrefix -> RelPathPrefix
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RelPathPrefix -> c RelPathPrefix
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RelPathPrefix
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> RelPathPrefix -> u
forall u. (forall d. Data d => d -> u) -> RelPathPrefix -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RelPathPrefix
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RelPathPrefix -> c RelPathPrefix
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c RelPathPrefix)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c RelPathPrefix)
$cNoPrefix :: Constr
$cParentDir :: Constr
$tRelPathPrefix :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
gmapMp :: (forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
gmapM :: (forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> RelPathPrefix -> m RelPathPrefix
gmapQi :: Int -> (forall d. Data d => d -> u) -> RelPathPrefix -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> RelPathPrefix -> u
gmapQ :: (forall d. Data d => d -> u) -> RelPathPrefix -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> RelPathPrefix -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> RelPathPrefix -> r
gmapT :: (forall b. Data b => b -> b) -> RelPathPrefix -> RelPathPrefix
$cgmapT :: (forall b. Data b => b -> b) -> RelPathPrefix -> RelPathPrefix
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c RelPathPrefix)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c RelPathPrefix)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c RelPathPrefix)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c RelPathPrefix)
dataTypeOf :: RelPathPrefix -> DataType
$cdataTypeOf :: RelPathPrefix -> DataType
toConstr :: RelPathPrefix -> Constr
$ctoConstr :: RelPathPrefix -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RelPathPrefix
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c RelPathPrefix
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RelPathPrefix -> c RelPathPrefix
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> RelPathPrefix -> c RelPathPrefix
$cp1Data :: Typeable RelPathPrefix
Data)

-- | Describes 'Path' base as absolute.
data Abs deriving (Abs -> Q Exp
Abs -> Q (TExp Abs)
(Abs -> Q Exp) -> (Abs -> Q (TExp Abs)) -> Lift Abs
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Abs -> Q (TExp Abs)
$cliftTyped :: Abs -> Q (TExp Abs)
lift :: Abs -> Q Exp
$clift :: Abs -> Q Exp
Lift, Typeable Abs
DataType
Typeable Abs
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Abs -> c Abs)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Abs)
-> (Abs -> Constr)
-> (Abs -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Abs))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Abs))
-> ((forall b. Data b => b -> b) -> Abs -> Abs)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r)
-> (forall u. (forall d. Data d => d -> u) -> Abs -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Abs -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Abs -> m Abs)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Abs -> m Abs)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Abs -> m Abs)
-> Data Abs
Abs -> DataType
Abs -> Constr
(forall b. Data b => b -> b) -> Abs -> Abs
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Abs -> c Abs
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Abs
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Abs -> u
forall u. (forall d. Data d => d -> u) -> Abs -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Abs -> m Abs
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Abs -> m Abs
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Abs
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Abs -> c Abs
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Abs)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Abs)
$tAbs :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Abs -> m Abs
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Abs -> m Abs
gmapMp :: (forall d. Data d => d -> m d) -> Abs -> m Abs
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Abs -> m Abs
gmapM :: (forall d. Data d => d -> m d) -> Abs -> m Abs
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Abs -> m Abs
gmapQi :: Int -> (forall d. Data d => d -> u) -> Abs -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Abs -> u
gmapQ :: (forall d. Data d => d -> u) -> Abs -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Abs -> [u]
gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r
gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Abs -> r
gmapT :: (forall b. Data b => b -> b) -> Abs -> Abs
$cgmapT :: (forall b. Data b => b -> b) -> Abs -> Abs
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Abs)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Abs)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Abs)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Abs)
dataTypeOf :: Abs -> DataType
$cdataTypeOf :: Abs -> DataType
toConstr :: Abs -> Constr
$ctoConstr :: Abs -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Abs
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Abs
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Abs -> c Abs
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Abs -> c Abs
$cp1Data :: Typeable Abs
Data)

-- | Describes 'Path' base as relative to the directory @dir@.
data Rel dir deriving (Rel dir -> Q Exp
Rel dir -> Q (TExp (Rel dir))
(Rel dir -> Q Exp)
-> (Rel dir -> Q (TExp (Rel dir))) -> Lift (Rel dir)
forall dir. Rel dir -> Q Exp
forall dir. Rel dir -> Q (TExp (Rel dir))
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Rel dir -> Q (TExp (Rel dir))
$cliftTyped :: forall dir. Rel dir -> Q (TExp (Rel dir))
lift :: Rel dir -> Q Exp
$clift :: forall dir. Rel dir -> Q Exp
Lift, Typeable (Rel dir)
DataType
Typeable (Rel dir)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Rel dir -> c (Rel dir))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (Rel dir))
-> (Rel dir -> Constr)
-> (Rel dir -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (Rel dir)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Rel dir)))
-> ((forall b. Data b => b -> b) -> Rel dir -> Rel dir)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Rel dir -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Rel dir -> r)
-> (forall u. (forall d. Data d => d -> u) -> Rel dir -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Rel dir -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir))
-> Data (Rel dir)
Rel dir -> DataType
Rel dir -> Constr
(forall d. Data d => c (t d)) -> Maybe (c (Rel dir))
(forall b. Data b => b -> b) -> Rel dir -> Rel dir
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Rel dir -> c (Rel dir)
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Rel dir)
forall dir. Data dir => Typeable (Rel dir)
forall dir. Data dir => Rel dir -> DataType
forall dir. Data dir => Rel dir -> Constr
forall dir.
Data dir =>
(forall b. Data b => b -> b) -> Rel dir -> Rel dir
forall dir u.
Data dir =>
Int -> (forall d. Data d => d -> u) -> Rel dir -> u
forall dir u.
Data dir =>
(forall d. Data d => d -> u) -> Rel dir -> [u]
forall dir r r'.
Data dir =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
forall dir r r'.
Data dir =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
forall dir (m :: * -> *).
(Data dir, Monad m) =>
(forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
forall dir (m :: * -> *).
(Data dir, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
forall dir (c :: * -> *).
Data dir =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Rel dir)
forall dir (c :: * -> *).
Data dir =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Rel dir -> c (Rel dir)
forall dir (t :: * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Rel dir))
forall dir (t :: * -> * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Rel dir))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Rel dir -> u
forall u. (forall d. Data d => d -> u) -> Rel dir -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Rel dir)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Rel dir -> c (Rel dir)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Rel dir))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Rel dir))
$tRel :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
$cgmapMo :: forall dir (m :: * -> *).
(Data dir, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
gmapMp :: (forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
$cgmapMp :: forall dir (m :: * -> *).
(Data dir, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
gmapM :: (forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
$cgmapM :: forall dir (m :: * -> *).
(Data dir, Monad m) =>
(forall d. Data d => d -> m d) -> Rel dir -> m (Rel dir)
gmapQi :: Int -> (forall d. Data d => d -> u) -> Rel dir -> u
$cgmapQi :: forall dir u.
Data dir =>
Int -> (forall d. Data d => d -> u) -> Rel dir -> u
gmapQ :: (forall d. Data d => d -> u) -> Rel dir -> [u]
$cgmapQ :: forall dir u.
Data dir =>
(forall d. Data d => d -> u) -> Rel dir -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
$cgmapQr :: forall dir r r'.
Data dir =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
$cgmapQl :: forall dir r r'.
Data dir =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Rel dir -> r
gmapT :: (forall b. Data b => b -> b) -> Rel dir -> Rel dir
$cgmapT :: forall dir.
Data dir =>
(forall b. Data b => b -> b) -> Rel dir -> Rel dir
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Rel dir))
$cdataCast2 :: forall dir (t :: * -> * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Rel dir))
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c (Rel dir))
$cdataCast1 :: forall dir (t :: * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Rel dir))
dataTypeOf :: Rel dir -> DataType
$cdataTypeOf :: forall dir. Data dir => Rel dir -> DataType
toConstr :: Rel dir -> Constr
$ctoConstr :: forall dir. Data dir => Rel dir -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Rel dir)
$cgunfold :: forall dir (c :: * -> *).
Data dir =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Rel dir)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Rel dir -> c (Rel dir)
$cgfoldl :: forall dir (c :: * -> *).
Data dir =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Rel dir -> c (Rel dir)
$cp1Data :: forall dir. Data dir => Typeable (Rel dir)
Data)

-- | Means that path points to a directory @dir@.
-- To use as a type in place of @dir@, we recommend creating an empty
-- data type representing the specific directory, e.g. @data ProjectRootDir@.
data Dir dir deriving (Dir dir -> Q Exp
Dir dir -> Q (TExp (Dir dir))
(Dir dir -> Q Exp)
-> (Dir dir -> Q (TExp (Dir dir))) -> Lift (Dir dir)
forall dir. Dir dir -> Q Exp
forall dir. Dir dir -> Q (TExp (Dir dir))
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Dir dir -> Q (TExp (Dir dir))
$cliftTyped :: forall dir. Dir dir -> Q (TExp (Dir dir))
lift :: Dir dir -> Q Exp
$clift :: forall dir. Dir dir -> Q Exp
Lift, Typeable (Dir dir)
DataType
Typeable (Dir dir)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Dir dir -> c (Dir dir))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (Dir dir))
-> (Dir dir -> Constr)
-> (Dir dir -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (Dir dir)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Dir dir)))
-> ((forall b. Data b => b -> b) -> Dir dir -> Dir dir)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Dir dir -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Dir dir -> r)
-> (forall u. (forall d. Data d => d -> u) -> Dir dir -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Dir dir -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir))
-> Data (Dir dir)
Dir dir -> DataType
Dir dir -> Constr
(forall d. Data d => c (t d)) -> Maybe (c (Dir dir))
(forall b. Data b => b -> b) -> Dir dir -> Dir dir
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Dir dir -> c (Dir dir)
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Dir dir)
forall dir. Data dir => Typeable (Dir dir)
forall dir. Data dir => Dir dir -> DataType
forall dir. Data dir => Dir dir -> Constr
forall dir.
Data dir =>
(forall b. Data b => b -> b) -> Dir dir -> Dir dir
forall dir u.
Data dir =>
Int -> (forall d. Data d => d -> u) -> Dir dir -> u
forall dir u.
Data dir =>
(forall d. Data d => d -> u) -> Dir dir -> [u]
forall dir r r'.
Data dir =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
forall dir r r'.
Data dir =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
forall dir (m :: * -> *).
(Data dir, Monad m) =>
(forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
forall dir (m :: * -> *).
(Data dir, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
forall dir (c :: * -> *).
Data dir =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Dir dir)
forall dir (c :: * -> *).
Data dir =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Dir dir -> c (Dir dir)
forall dir (t :: * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Dir dir))
forall dir (t :: * -> * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Dir dir))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Dir dir -> u
forall u. (forall d. Data d => d -> u) -> Dir dir -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Dir dir)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Dir dir -> c (Dir dir)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Dir dir))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Dir dir))
$tDir :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
$cgmapMo :: forall dir (m :: * -> *).
(Data dir, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
gmapMp :: (forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
$cgmapMp :: forall dir (m :: * -> *).
(Data dir, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
gmapM :: (forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
$cgmapM :: forall dir (m :: * -> *).
(Data dir, Monad m) =>
(forall d. Data d => d -> m d) -> Dir dir -> m (Dir dir)
gmapQi :: Int -> (forall d. Data d => d -> u) -> Dir dir -> u
$cgmapQi :: forall dir u.
Data dir =>
Int -> (forall d. Data d => d -> u) -> Dir dir -> u
gmapQ :: (forall d. Data d => d -> u) -> Dir dir -> [u]
$cgmapQ :: forall dir u.
Data dir =>
(forall d. Data d => d -> u) -> Dir dir -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
$cgmapQr :: forall dir r r'.
Data dir =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
$cgmapQl :: forall dir r r'.
Data dir =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Dir dir -> r
gmapT :: (forall b. Data b => b -> b) -> Dir dir -> Dir dir
$cgmapT :: forall dir.
Data dir =>
(forall b. Data b => b -> b) -> Dir dir -> Dir dir
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Dir dir))
$cdataCast2 :: forall dir (t :: * -> * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Dir dir))
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c (Dir dir))
$cdataCast1 :: forall dir (t :: * -> *) (c :: * -> *).
(Data dir, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Dir dir))
dataTypeOf :: Dir dir -> DataType
$cdataTypeOf :: forall dir. Data dir => Dir dir -> DataType
toConstr :: Dir dir -> Constr
$ctoConstr :: forall dir. Data dir => Dir dir -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Dir dir)
$cgunfold :: forall dir (c :: * -> *).
Data dir =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Dir dir)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Dir dir -> c (Dir dir)
$cgfoldl :: forall dir (c :: * -> *).
Data dir =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Dir dir -> c (Dir dir)
$cp1Data :: forall dir. Data dir => Typeable (Dir dir)
Data)

-- | Means that path points to a file @file@.
-- To use as a type in place of @file@, we recommend creating an empty
-- data type representing the specific file, e.g. @data ProjectManifestFile@.
data File file deriving (File file -> Q Exp
File file -> Q (TExp (File file))
(File file -> Q Exp)
-> (File file -> Q (TExp (File file))) -> Lift (File file)
forall file. File file -> Q Exp
forall file. File file -> Q (TExp (File file))
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: File file -> Q (TExp (File file))
$cliftTyped :: forall file. File file -> Q (TExp (File file))
lift :: File file -> Q Exp
$clift :: forall file. File file -> Q Exp
Lift, Typeable (File file)
DataType
Typeable (File file)
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> File file -> c (File file))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (File file))
-> (File file -> Constr)
-> (File file -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (File file)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (File file)))
-> ((forall b. Data b => b -> b) -> File file -> File file)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> File file -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> File file -> r)
-> (forall u. (forall d. Data d => d -> u) -> File file -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> File file -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> File file -> m (File file))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> File file -> m (File file))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> File file -> m (File file))
-> Data (File file)
File file -> DataType
File file -> Constr
(forall d. Data d => c (t d)) -> Maybe (c (File file))
(forall b. Data b => b -> b) -> File file -> File file
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> File file -> c (File file)
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (File file)
forall file. Data file => Typeable (File file)
forall file. Data file => File file -> DataType
forall file. Data file => File file -> Constr
forall file.
Data file =>
(forall b. Data b => b -> b) -> File file -> File file
forall file u.
Data file =>
Int -> (forall d. Data d => d -> u) -> File file -> u
forall file u.
Data file =>
(forall d. Data d => d -> u) -> File file -> [u]
forall file r r'.
Data file =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
forall file r r'.
Data file =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
forall file (m :: * -> *).
(Data file, Monad m) =>
(forall d. Data d => d -> m d) -> File file -> m (File file)
forall file (m :: * -> *).
(Data file, MonadPlus m) =>
(forall d. Data d => d -> m d) -> File file -> m (File file)
forall file (c :: * -> *).
Data file =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (File file)
forall file (c :: * -> *).
Data file =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> File file -> c (File file)
forall file (t :: * -> *) (c :: * -> *).
(Data file, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (File file))
forall file (t :: * -> * -> *) (c :: * -> *).
(Data file, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (File file))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> File file -> u
forall u. (forall d. Data d => d -> u) -> File file -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> File file -> m (File file)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> File file -> m (File file)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (File file)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> File file -> c (File file)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (File file))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (File file))
$tFile :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> File file -> m (File file)
$cgmapMo :: forall file (m :: * -> *).
(Data file, MonadPlus m) =>
(forall d. Data d => d -> m d) -> File file -> m (File file)
gmapMp :: (forall d. Data d => d -> m d) -> File file -> m (File file)
$cgmapMp :: forall file (m :: * -> *).
(Data file, MonadPlus m) =>
(forall d. Data d => d -> m d) -> File file -> m (File file)
gmapM :: (forall d. Data d => d -> m d) -> File file -> m (File file)
$cgmapM :: forall file (m :: * -> *).
(Data file, Monad m) =>
(forall d. Data d => d -> m d) -> File file -> m (File file)
gmapQi :: Int -> (forall d. Data d => d -> u) -> File file -> u
$cgmapQi :: forall file u.
Data file =>
Int -> (forall d. Data d => d -> u) -> File file -> u
gmapQ :: (forall d. Data d => d -> u) -> File file -> [u]
$cgmapQ :: forall file u.
Data file =>
(forall d. Data d => d -> u) -> File file -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
$cgmapQr :: forall file r r'.
Data file =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
$cgmapQl :: forall file r r'.
Data file =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> File file -> r
gmapT :: (forall b. Data b => b -> b) -> File file -> File file
$cgmapT :: forall file.
Data file =>
(forall b. Data b => b -> b) -> File file -> File file
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (File file))
$cdataCast2 :: forall file (t :: * -> * -> *) (c :: * -> *).
(Data file, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (File file))
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c (File file))
$cdataCast1 :: forall file (t :: * -> *) (c :: * -> *).
(Data file, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (File file))
dataTypeOf :: File file -> DataType
$cdataTypeOf :: forall file. Data file => File file -> DataType
toConstr :: File file -> Constr
$ctoConstr :: forall file. Data file => File file -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (File file)
$cgunfold :: forall file (c :: * -> *).
Data file =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (File file)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> File file -> c (File file)
$cgfoldl :: forall file (c :: * -> *).
Data file =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> File file -> c (File file)
$cp1Data :: forall file. Data file => Typeable (File file)
Data)

-- | Describes 'Path' standard as posix (e.g. @\/path\/to\/foobar@).
-- This makes 'Path' behave in system-independent fashion: code behaves the same
-- regardless of the system it is running on.
-- You will normally want to use it when dealing with paths from some external source,
-- or with paths that have explicitely fixed standard.
-- For example, if you are running your Haskell program on Windows and parsing logs which
-- were obtained from the Linux server, or maybe you are parsing Javascript import statements,
-- you will want to use 'Posix'.
data Posix deriving (Posix -> Q Exp
Posix -> Q (TExp Posix)
(Posix -> Q Exp) -> (Posix -> Q (TExp Posix)) -> Lift Posix
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Posix -> Q (TExp Posix)
$cliftTyped :: Posix -> Q (TExp Posix)
lift :: Posix -> Q Exp
$clift :: Posix -> Q Exp
Lift, Typeable Posix
DataType
Typeable Posix
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Posix -> c Posix)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Posix)
-> (Posix -> Constr)
-> (Posix -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Posix))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Posix))
-> ((forall b. Data b => b -> b) -> Posix -> Posix)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r)
-> (forall u. (forall d. Data d => d -> u) -> Posix -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Posix -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Posix -> m Posix)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Posix -> m Posix)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Posix -> m Posix)
-> Data Posix
Posix -> DataType
Posix -> Constr
(forall b. Data b => b -> b) -> Posix -> Posix
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Posix -> c Posix
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Posix
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Posix -> u
forall u. (forall d. Data d => d -> u) -> Posix -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Posix -> m Posix
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Posix -> m Posix
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Posix
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Posix -> c Posix
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Posix)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Posix)
$tPosix :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Posix -> m Posix
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Posix -> m Posix
gmapMp :: (forall d. Data d => d -> m d) -> Posix -> m Posix
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Posix -> m Posix
gmapM :: (forall d. Data d => d -> m d) -> Posix -> m Posix
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Posix -> m Posix
gmapQi :: Int -> (forall d. Data d => d -> u) -> Posix -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Posix -> u
gmapQ :: (forall d. Data d => d -> u) -> Posix -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Posix -> [u]
gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r
gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Posix -> r
gmapT :: (forall b. Data b => b -> b) -> Posix -> Posix
$cgmapT :: (forall b. Data b => b -> b) -> Posix -> Posix
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Posix)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Posix)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Posix)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Posix)
dataTypeOf :: Posix -> DataType
$cdataTypeOf :: Posix -> DataType
toConstr :: Posix -> Constr
$ctoConstr :: Posix -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Posix
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Posix
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Posix -> c Posix
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Posix -> c Posix
$cp1Data :: Typeable Posix
Data)

-- | Describes 'Path' standard as windows (e.g. @C:\\path\\to\\foobar@).
-- Check 'Posix' for more details, everything is analogous.
data Windows deriving (Windows -> Q Exp
Windows -> Q (TExp Windows)
(Windows -> Q Exp) -> (Windows -> Q (TExp Windows)) -> Lift Windows
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: Windows -> Q (TExp Windows)
$cliftTyped :: Windows -> Q (TExp Windows)
lift :: Windows -> Q Exp
$clift :: Windows -> Q Exp
Lift, Typeable Windows
DataType
Typeable Windows
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Windows -> c Windows)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Windows)
-> (Windows -> Constr)
-> (Windows -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Windows))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Windows))
-> ((forall b. Data b => b -> b) -> Windows -> Windows)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Windows -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Windows -> r)
-> (forall u. (forall d. Data d => d -> u) -> Windows -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Windows -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Windows -> m Windows)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Windows -> m Windows)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Windows -> m Windows)
-> Data Windows
Windows -> DataType
Windows -> Constr
(forall b. Data b => b -> b) -> Windows -> Windows
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Windows -> c Windows
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Windows
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Windows -> u
forall u. (forall d. Data d => d -> u) -> Windows -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Windows -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Windows -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Windows -> m Windows
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Windows -> m Windows
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Windows
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Windows -> c Windows
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Windows)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Windows)
$tWindows :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Windows -> m Windows
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Windows -> m Windows
gmapMp :: (forall d. Data d => d -> m d) -> Windows -> m Windows
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Windows -> m Windows
gmapM :: (forall d. Data d => d -> m d) -> Windows -> m Windows
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Windows -> m Windows
gmapQi :: Int -> (forall d. Data d => d -> u) -> Windows -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Windows -> u
gmapQ :: (forall d. Data d => d -> u) -> Windows -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Windows -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Windows -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Windows -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Windows -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Windows -> r
gmapT :: (forall b. Data b => b -> b) -> Windows -> Windows
$cgmapT :: (forall b. Data b => b -> b) -> Windows -> Windows
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Windows)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Windows)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Windows)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Windows)
dataTypeOf :: Windows -> DataType
$cdataTypeOf :: Windows -> DataType
toConstr :: Windows -> Constr
$ctoConstr :: Windows -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Windows
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Windows
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Windows -> c Windows
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Windows -> c Windows
$cp1Data :: Typeable Windows
Data)

-- | Describes 'Path' standard to be determined by the system/OS.
--
-- If the system is Windows, it will resolve to 'Windows' internally, and if not,
-- it will resolve to 'Posix'.
--
-- However, keep in mind that even if running on Windows, @Path Windows b t@
-- and @Path System b t@ are still considered to be different types,
-- even though @Path System b t @ internally uses Windows standard.
--
-- You will normally want to use 'System' if you are dealing with the paths on the disk of the host OS
-- (where your code is running), for example if user is providing you with the path to the file on the disk
-- that you will be doing something with.
-- Keep in mind that 'System' causes the behaviour of 'Path' to be system/platform-dependant.
data System deriving (System -> Q Exp
System -> Q (TExp System)
(System -> Q Exp) -> (System -> Q (TExp System)) -> Lift System
forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t
liftTyped :: System -> Q (TExp System)
$cliftTyped :: System -> Q (TExp System)
lift :: System -> Q Exp
$clift :: System -> Q Exp
Lift, Typeable System
DataType
Typeable System
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> System -> c System)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c System)
-> (System -> Constr)
-> (System -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c System))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c System))
-> ((forall b. Data b => b -> b) -> System -> System)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> System -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> System -> r)
-> (forall u. (forall d. Data d => d -> u) -> System -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> System -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> System -> m System)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> System -> m System)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> System -> m System)
-> Data System
System -> DataType
System -> Constr
(forall b. Data b => b -> b) -> System -> System
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> System -> c System
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c System
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> System -> u
forall u. (forall d. Data d => d -> u) -> System -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> System -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> System -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> System -> m System
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> System -> m System
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c System
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> System -> c System
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c System)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c System)
$tSystem :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> System -> m System
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> System -> m System
gmapMp :: (forall d. Data d => d -> m d) -> System -> m System
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> System -> m System
gmapM :: (forall d. Data d => d -> m d) -> System -> m System
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> System -> m System
gmapQi :: Int -> (forall d. Data d => d -> u) -> System -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> System -> u
gmapQ :: (forall d. Data d => d -> u) -> System -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> System -> [u]
gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> System -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> System -> r
gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> System -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> System -> r
gmapT :: (forall b. Data b => b -> b) -> System -> System
$cgmapT :: (forall b. Data b => b -> b) -> System -> System
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c System)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c System)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c System)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c System)
dataTypeOf :: System -> DataType
$cdataTypeOf :: System -> DataType
toConstr :: System -> Constr
$ctoConstr :: System -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c System
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c System
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> System -> c System
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> System -> c System
$cp1Data :: Typeable System
Data) -- Depends on the platform, it is either Posix or Windows.

-- | 'System' is the most commonly used standard, so we provide you with a type alias for it.
type Path' = Path System

-- | When you don't want your path to be relative to anything specific,
-- it is convenient to use unit @()@.
type Rel' = Rel ()

-- | When you don't want your directory path to be named,
-- it is convenient to use unit @()@.
type Dir' = Dir ()

-- | When you don't want your file path to be named,
-- it is convenient to use unit @()@.
type File' = File ()

-- TODO: Extract `parseRelFileFP`, `parseRelDirFP`, `parseRelFP` and `extractRelPathPrefix` into StrongPath.FilePath.Internals?

parseRelFileFP ::
  MonadThrow m =>
  (p -> RelPathPrefix -> Path s (Rel d) (File f)) ->
  [Char] ->
  (FilePath -> m p) ->
  FilePath ->
  m (Path s (Rel d) (File f))
parseRelFileFP :: (p -> RelPathPrefix -> Path s (Rel d) (File f))
-> String
-> (String -> m p)
-> String
-> m (Path s (Rel d) (File f))
parseRelFileFP p -> RelPathPrefix -> Path s (Rel d) (File f)
_ String
_ String -> m p
_ String
"" = PathException -> m (Path s (Rel d) (File f))
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (String -> PathException
P.InvalidRelFile String
"")
parseRelFileFP p -> RelPathPrefix -> Path s (Rel d) (File f)
constructor String
validSeparators String -> m p
pathParser String
fp = (p -> RelPathPrefix -> Path s (Rel d) (File f))
-> String
-> (String -> m p)
-> String
-> m (Path s (Rel d) (File f))
forall (m :: * -> *) p s d1 t.
MonadThrow m =>
(p -> RelPathPrefix -> Path s (Rel d1) t)
-> String -> (String -> m p) -> String -> m (Path s (Rel d1) t)
parseRelFP p -> RelPathPrefix -> Path s (Rel d) (File f)
constructor String
validSeparators String -> m p
pathParser String
fp

parseRelDirFP ::
  MonadThrow m =>
  (p -> RelPathPrefix -> Path s (Rel d1) (Dir d2)) ->
  [Char] ->
  (FilePath -> m p) ->
  FilePath ->
  m (Path s (Rel d1) (Dir d2))
parseRelDirFP :: (p -> RelPathPrefix -> Path s (Rel d1) (Dir d2))
-> String
-> (String -> m p)
-> String
-> m (Path s (Rel d1) (Dir d2))
parseRelDirFP p -> RelPathPrefix -> Path s (Rel d1) (Dir d2)
_ String
_ String -> m p
_ String
"" = PathException -> m (Path s (Rel d1) (Dir d2))
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (String -> PathException
P.InvalidRelDir String
"")
parseRelDirFP p -> RelPathPrefix -> Path s (Rel d1) (Dir d2)
constructor String
validSeparators String -> m p
pathParser String
fp = (p -> RelPathPrefix -> Path s (Rel d1) (Dir d2))
-> String
-> (String -> m p)
-> String
-> m (Path s (Rel d1) (Dir d2))
forall (m :: * -> *) p s d1 t.
MonadThrow m =>
(p -> RelPathPrefix -> Path s (Rel d1) t)
-> String -> (String -> m p) -> String -> m (Path s (Rel d1) t)
parseRelFP p -> RelPathPrefix -> Path s (Rel d1) (Dir d2)
constructor String
validSeparators String -> m p
pathParser String
fp

-- Helper function for the parseRelFileFP and parseRelDirFP, should not be used called directly but only
-- by parseRelFileFP and parseRelDirFP.
parseRelFP ::
  MonadThrow m =>
  (p -> RelPathPrefix -> Path s (Rel d1) t) ->
  [Char] ->
  (FilePath -> m p) ->
  FilePath ->
  m (Path s (Rel d1) t)
parseRelFP :: (p -> RelPathPrefix -> Path s (Rel d1) t)
-> String -> (String -> m p) -> String -> m (Path s (Rel d1) t)
parseRelFP p -> RelPathPrefix -> Path s (Rel d1) t
_ String
_ String -> m p
_ String
"" = String -> m (Path s (Rel d1) t)
forall a. HasCallStack => String -> a
error String
"can't parse empty path"
parseRelFP p -> RelPathPrefix -> Path s (Rel d1) t
constructor String
validSeparators String -> m p
pathParser String
fp = do
  let (RelPathPrefix
prefix, String
fp') = String -> String -> (RelPathPrefix, String)
extractRelPathPrefix String
validSeparators String
fp
      fp'' :: String
fp'' = if String
fp' String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"" then String
"." else String
fp' -- Because Path Rel parsers can't handle just "".
  (\p
p -> p -> RelPathPrefix -> Path s (Rel d1) t
constructor p
p RelPathPrefix
prefix) (p -> Path s (Rel d1) t) -> m p -> m (Path s (Rel d1) t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> m p
pathParser String
fp''

-- | Extracts a multiple "../" from start of the file path.
--   If path is completely ../../.., also handles the last one.
--   NOTE: We don't normalize path in any way.
extractRelPathPrefix :: [Char] -> FilePath -> (RelPathPrefix, FilePath)
extractRelPathPrefix :: String -> String -> (RelPathPrefix, String)
extractRelPathPrefix String
validSeparators String
path =
  let (Int
n, String
path') = String -> (Int, String)
dropParentDirs String
path
   in (if Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 then RelPathPrefix
NoPrefix else Int -> RelPathPrefix
ParentDir Int
n, String
path')
  where
    parentDirStrings :: [String]
    parentDirStrings :: [String]
parentDirStrings = [[Char
'.', Char
'.', Char
s] | Char
s <- String
validSeparators]

    pathStartsWithParentDir :: FilePath -> Bool
    pathStartsWithParentDir :: String -> Bool
pathStartsWithParentDir String
p = Int -> ShowS
forall a. Int -> [a] -> [a]
take Int
3 String
p String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
parentDirStrings

    dropParentDirs :: FilePath -> (Int, FilePath)
    dropParentDirs :: String -> (Int, String)
dropParentDirs String
p
      | String -> Bool
pathStartsWithParentDir String
p =
        let (Int
n, String
p') = String -> (Int, String)
dropParentDirs (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
3 String
p)
         in (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n, String
p')
      | String
p String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
".." = (Int
1, String
"")
      | Bool
otherwise = (Int
0, String
p)

prefixNumParentDirs :: RelPathPrefix -> Int
prefixNumParentDirs :: RelPathPrefix -> Int
prefixNumParentDirs RelPathPrefix
NoPrefix = Int
0
prefixNumParentDirs (ParentDir Int
n) = Int
n

relPathNumParentDirs :: Path s (Rel r) t -> Int
relPathNumParentDirs :: Path s (Rel r) t -> Int
relPathNumParentDirs = RelPathPrefix -> Int
prefixNumParentDirs (RelPathPrefix -> Int)
-> (Path s (Rel r) t -> RelPathPrefix) -> Path s (Rel r) t -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Path s (Rel r) t -> RelPathPrefix
forall s r t. Path s (Rel r) t -> RelPathPrefix
relPathPrefix

relPathPrefix :: Path s (Rel r) t -> RelPathPrefix
relPathPrefix :: Path s (Rel r) t -> RelPathPrefix
relPathPrefix Path s (Rel r) t
sp = case Path s (Rel r) t
sp of
  RelDir Path Rel Dir
_ RelPathPrefix
pr -> RelPathPrefix
pr
  RelFile Path Rel File
_ RelPathPrefix
pr -> RelPathPrefix
pr
  RelDirW Path Rel Dir
_ RelPathPrefix
pr -> RelPathPrefix
pr
  RelFileW Path Rel File
_ RelPathPrefix
pr -> RelPathPrefix
pr
  RelDirP Path Rel Dir
_ RelPathPrefix
pr -> RelPathPrefix
pr
  RelFileP Path Rel File
_ RelPathPrefix
pr -> RelPathPrefix
pr
  Path s (Rel r) t
_ -> RelPathPrefix
forall a. a
impossible

impossible :: a
impossible :: a
impossible = String -> a
forall a. HasCallStack => String -> a
error String
"This should be impossible."