filepather 0.4.0 → 0.4.1
raw patch · 8 files changed
+409/−22 lines, 8 filesdep +timePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: time
API changes (from Hackage documentation)
- System.FilePath.FilePather.Find: findFiles :: ReadFilePathT IO Bool -> ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Compose: (-<<-) :: Bind f => ReadFilePathT f b -> ToFilePathT f a -> a -> f b
+ System.FilePath.FilePather.Compose: (->>-) :: Bind f => ToFilePathT f a -> ReadFilePathT f b -> a -> f b
+ System.FilePath.FilePather.Compose: composeReadTo :: Bind f => ReadFilePathT f b -> ToFilePathT f a -> a -> f b
+ System.FilePath.FilePather.Compose: composeToRead :: Bind f => ToFilePathT f a -> ReadFilePathT f b -> a -> f b
+ System.FilePath.FilePather.Compose: infixr 1 -<<-
+ System.FilePath.FilePather.Directory: XdgCache :: XdgDirectory
+ System.FilePath.FilePather.Directory: XdgConfig :: XdgDirectory
+ System.FilePath.FilePather.Directory: XdgConfigDirs :: XdgDirectoryList
+ System.FilePath.FilePather.Directory: XdgData :: XdgDirectory
+ System.FilePath.FilePather.Directory: XdgDataDirs :: XdgDirectoryList
+ System.FilePath.FilePather.Directory: canonicalizePath :: ReadFilePathT IO FilePath
+ System.FilePath.FilePather.Directory: copyFile :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: copyFileWithMetadata :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: copyPermissions :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: createDirectory :: ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: createDirectoryIfMissing :: Bool -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: createDirectoryLink :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: createFileLink :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: data Permissions
+ System.FilePath.FilePather.Directory: data XdgDirectory
+ System.FilePath.FilePather.Directory: data XdgDirectoryList
+ System.FilePath.FilePather.Directory: doesDirectoryExist :: ReadFilePathT IO Bool
+ System.FilePath.FilePather.Directory: doesFileExist :: ReadFilePathT IO Bool
+ System.FilePath.FilePather.Directory: doesPathExist :: ReadFilePathT IO Bool
+ System.FilePath.FilePather.Directory: emptyPermissions :: Permissions
+ System.FilePath.FilePather.Directory: exeExtension :: String
+ System.FilePath.FilePather.Directory: findExecutable :: ReadFilePathT IO (Maybe FilePath)
+ System.FilePath.FilePather.Directory: findExecutables :: ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Directory: findExecutablesInDirectories :: [FilePath] -> ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Directory: findFile :: [FilePath] -> ReadFilePathT IO (Maybe FilePath)
+ System.FilePath.FilePather.Directory: findFileWith :: ReadFilePathT IO Bool -> [FilePath] -> ReadFilePathT IO (Maybe FilePath)
+ System.FilePath.FilePather.Directory: findFiles :: [FilePath] -> ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Directory: findFilesWith :: ReadFilePathT IO Bool -> [FilePath] -> ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Directory: getAccessTime :: ReadFilePathT IO UTCTime
+ System.FilePath.FilePather.Directory: getAppUserDataDirectory :: ReadFilePathT IO FilePath
+ System.FilePath.FilePather.Directory: getCurrentDirectory :: IO FilePath
+ System.FilePath.FilePather.Directory: getDirectoryContents :: ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Directory: getFileSize :: ReadFilePathT IO Integer
+ System.FilePath.FilePather.Directory: getHomeDirectory :: IO FilePath
+ System.FilePath.FilePather.Directory: getModificationTime :: ReadFilePathT IO UTCTime
+ System.FilePath.FilePather.Directory: getPermissions :: ReadFilePathT IO Permissions
+ System.FilePath.FilePather.Directory: getSymbolicLinkTarget :: ReadFilePathT IO FilePath
+ System.FilePath.FilePather.Directory: getTemporaryDirectory :: IO FilePath
+ System.FilePath.FilePather.Directory: getUserDocumentsDirectory :: IO FilePath
+ System.FilePath.FilePather.Directory: getXdgDirectory :: XdgDirectory -> ReadFilePathT IO FilePath
+ System.FilePath.FilePather.Directory: getXdgDirectoryList :: XdgDirectoryList -> IO [FilePath]
+ System.FilePath.FilePather.Directory: listDirectory :: ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Directory: makeAbsolute :: ReadFilePathT IO FilePath
+ System.FilePath.FilePather.Directory: makeRelativeToCurrentDirectory :: ReadFilePathT IO FilePath
+ System.FilePath.FilePather.Directory: pathIsSymbolicLink :: ReadFilePathT IO Bool
+ System.FilePath.FilePather.Directory: removeDirectory :: ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: removeDirectoryLink :: ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: removeDirectoryRecursive :: ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: removeFile :: ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: removePathForcibly :: ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: renameDirectory :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: renameFile :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: renamePath :: FilePath -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: setAccessTime :: UTCTime -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: setModificationTime :: UTCTime -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: setOwnerExecutable :: Bool -> Permissions -> Permissions
+ System.FilePath.FilePather.Directory: setOwnerReadable :: Bool -> Permissions -> Permissions
+ System.FilePath.FilePather.Directory: setOwnerSearchable :: Bool -> Permissions -> Permissions
+ System.FilePath.FilePather.Directory: setOwnerWritable :: Bool -> Permissions -> Permissions
+ System.FilePath.FilePather.Directory: setPermissions :: Permissions -> ReadFilePathT IO ()
+ System.FilePath.FilePather.Directory: withCurrentDirectory :: IO a -> ReadFilePathT IO a
+ System.FilePath.FilePather.Find: findAllFiles :: ReadFilePathT IO Bool -> ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Find: findFilesBase :: ReadFilePathT IO Bool -> ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.Find: findFilesBaseAlways :: ReadFilePathT IO [FilePath]
+ System.FilePath.FilePather.ToFilePath: instance GHC.Base.Applicative f => Data.Functor.Contravariant.Divisible.Decidable (System.FilePath.FilePather.ToFilePath.ToFilePathT f)
+ System.FilePath.FilePather.ToFilePath: instance GHC.Base.Applicative f => Data.Functor.Contravariant.Divisible.Divisible (System.FilePath.FilePather.ToFilePath.ToFilePathT f)
- System.FilePath.FilePather.ToFilePath: toRead :: Iso' (ToFilePath FilePath) (ReadFilePath FilePath)
+ System.FilePath.FilePather.ToFilePath: toRead :: Iso (ToFilePathT f FilePath) (ToFilePathT f' FilePath) (ReadFilePathT f FilePath) (ReadFilePathT f' FilePath)
Files
- changelog.md +5/−0
- filepather.cabal +4/−1
- src/System/FilePath/FilePather.hs +2/−0
- src/System/FilePath/FilePather/Compose.hs +55/−0
- src/System/FilePath/FilePather/Directory.hs +292/−0
- src/System/FilePath/FilePather/Find.hs +21/−5
- src/System/FilePath/FilePather/Posix.hs +2/−2
- src/System/FilePath/FilePather/ToFilePath.hs +28/−14
changelog.md view
@@ -1,3 +1,8 @@+0.4.1++* Add `System.Directory`+* Other minor improvements+ 0.4.0 * Rewrite of filepather
filepather.cabal view
@@ -1,5 +1,5 @@ name: filepather-version: 0.4.0+version: 0.4.1 synopsis: Functions on System.FilePath description: Functions over @System.FilePath@ including a find function for recursing down directories.@@ -23,6 +23,8 @@ library exposed-modules: System.FilePath.FilePather+ System.FilePath.FilePather.Compose+ System.FilePath.FilePather.Directory System.FilePath.FilePather.Find System.FilePath.FilePather.ReadFilePath System.FilePath.FilePather.ToFilePath@@ -38,6 +40,7 @@ , mtl >= 2.2 && < 2.3 , semigroups >= 0.9 && < 1 , semigroupoids >= 5.2 && < 6+ , time >= 1.2 && < 2 , transformers >= 0.5 && < 0.7 hs-source-dirs: src
src/System/FilePath/FilePather.hs view
@@ -2,6 +2,8 @@ module P ) where +import System.FilePath.FilePather.Compose as P+import System.FilePath.FilePather.Directory as P import System.FilePath.FilePather.Find as P import System.FilePath.FilePather.Posix as P import System.FilePath.FilePather.ReadFilePath as P
+ src/System/FilePath/FilePather/Compose.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -Wall #-}+{-# LANGUAGE NoImplicitPrelude #-}++module System.FilePath.FilePather.Compose(+ composeToRead+, (->>-)+, composeReadTo+, (-<<-)+) where++import Control.Lens ( view, Wrapped(_Wrapped') )+import Data.Functor.Bind ( (-<-), (->-), Bind )+import System.FilePath.FilePather.ReadFilePath+ ( ReadFilePathT(..) )+import System.FilePath.FilePather.ToFilePath ( ToFilePathT(..) )++composeToRead ::+ Bind f =>+ ToFilePathT f a+ -> ReadFilePathT f b+ -> a+ -> f b+composeToRead f g =+ view _Wrapped' f ->- view _Wrapped' g++(->>-) ::+ Bind f =>+ ToFilePathT f a+ -> ReadFilePathT f b+ -> a+ -> f b+(->>-) =+ composeToRead++infixr 1 ->>-++composeReadTo ::+ Bind f =>+ ReadFilePathT f b+ -> ToFilePathT f a+ -> a+ -> f b+composeReadTo f g =+ view _Wrapped' f -<- view _Wrapped' g++(-<<-) ::+ Bind f =>+ ReadFilePathT f b+ -> ToFilePathT f a+ -> a+ -> f b+(-<<-) =+ composeReadTo++infixr 1 -<<-
+ src/System/FilePath/FilePather/Directory.hs view
@@ -0,0 +1,292 @@+{-# OPTIONS_GHC -Wall #-}+{-# LANGUAGE NoImplicitPrelude #-}++module System.FilePath.FilePather.Directory(+ createDirectory+, createDirectoryIfMissing+, removeDirectory+, removeDirectoryRecursive+, removePathForcibly+, renameDirectory+, listDirectory+, getDirectoryContents+, withCurrentDirectory+, getXdgDirectory+, getAppUserDataDirectory+, removeFile+, renameFile+, renamePath+, copyFile+, copyFileWithMetadata+, getFileSize+, canonicalizePath+, makeAbsolute+, makeRelativeToCurrentDirectory+, doesPathExist+, doesFileExist+, doesDirectoryExist+, findExecutable+, findExecutables+, findExecutablesInDirectories+, findFile+, findFiles+, findFileWith+, findFilesWith+, createFileLink+, createDirectoryLink+, removeDirectoryLink+, pathIsSymbolicLink+, getSymbolicLinkTarget+, getPermissions+, setPermissions+, copyPermissions+, getAccessTime+, getModificationTime+, setAccessTime+, setModificationTime+, module SD+) where++import Control.Category ( Category((.)) )+import Control.Lens ( over, _Wrapped )+import Data.Maybe ( Maybe )+import Data.Bool ( Bool )+import Data.Time ( UTCTime )+import GHC.Num( Integer )+import qualified System.Directory as D+import System.Directory as SD(getCurrentDirectory, getHomeDirectory, XdgDirectory(..), XdgDirectoryList(..), getXdgDirectoryList, getUserDocumentsDirectory, getTemporaryDirectory, exeExtension, Permissions(..), emptyPermissions, readable, writable, executable, searchable, setOwnerReadable, setOwnerWritable, setOwnerExecutable, setOwnerSearchable)+import System.FilePath.FilePather.ReadFilePath+ ( ReadFilePathT(..) )+import System.FilePath ( FilePath )+import System.IO ( IO )++createDirectory ::+ ReadFilePathT IO ()+createDirectory =+ ReadFilePathT D.createDirectory++createDirectoryIfMissing ::+ Bool+ -> ReadFilePathT IO ()+createDirectoryIfMissing =+ ReadFilePathT . D.createDirectoryIfMissing++removeDirectory ::+ ReadFilePathT IO ()+removeDirectory =+ ReadFilePathT D.removeDirectory++removeDirectoryRecursive ::+ ReadFilePathT IO ()+removeDirectoryRecursive =+ ReadFilePathT D.removeDirectoryRecursive++removePathForcibly ::+ ReadFilePathT IO ()+removePathForcibly =+ ReadFilePathT D.removePathForcibly++renameDirectory ::+ FilePath+ -> ReadFilePathT IO ()+renameDirectory =+ ReadFilePathT . D.renameDirectory++listDirectory ::+ ReadFilePathT IO [FilePath]+listDirectory =+ ReadFilePathT D.listDirectory++getDirectoryContents ::+ ReadFilePathT IO [FilePath]+getDirectoryContents =+ ReadFilePathT D.listDirectory++withCurrentDirectory ::+ IO a+ -> ReadFilePathT IO a+withCurrentDirectory io =+ ReadFilePathT (`D.withCurrentDirectory` io)++getXdgDirectory ::+ XdgDirectory+ -> ReadFilePathT IO FilePath+getXdgDirectory xdg =+ ReadFilePathT (D.getXdgDirectory xdg)++getAppUserDataDirectory ::+ ReadFilePathT IO FilePath+getAppUserDataDirectory =+ ReadFilePathT D.getAppUserDataDirectory++removeFile ::+ ReadFilePathT IO ()+removeFile =+ ReadFilePathT D.removeFile++renameFile ::+ FilePath+ -> ReadFilePathT IO ()+renameFile =+ ReadFilePathT . D.renameFile++renamePath ::+ FilePath+ -> ReadFilePathT IO ()+renamePath =+ ReadFilePathT . D.renamePath++copyFile ::+ FilePath+ -> ReadFilePathT IO ()+copyFile =+ ReadFilePathT . D.copyFile++copyFileWithMetadata ::+ FilePath+ -> ReadFilePathT IO ()+copyFileWithMetadata =+ ReadFilePathT . D.copyFileWithMetadata++getFileSize ::+ ReadFilePathT IO Integer+getFileSize =+ ReadFilePathT D.getFileSize++canonicalizePath ::+ ReadFilePathT IO FilePath+canonicalizePath =+ ReadFilePathT D.canonicalizePath++makeAbsolute ::+ ReadFilePathT IO FilePath+makeAbsolute =+ ReadFilePathT D.makeAbsolute++makeRelativeToCurrentDirectory ::+ ReadFilePathT IO FilePath+makeRelativeToCurrentDirectory =+ ReadFilePathT D.makeRelativeToCurrentDirectory++doesPathExist ::+ ReadFilePathT IO Bool+doesPathExist =+ ReadFilePathT D.doesPathExist++doesFileExist ::+ ReadFilePathT IO Bool+doesFileExist =+ ReadFilePathT D.doesFileExist++doesDirectoryExist ::+ ReadFilePathT IO Bool+doesDirectoryExist =+ ReadFilePathT D.doesDirectoryExist++findExecutable ::+ ReadFilePathT IO (Maybe FilePath)+findExecutable =+ ReadFilePathT D.findExecutable++findExecutables ::+ ReadFilePathT IO [FilePath]+findExecutables =+ ReadFilePathT D.findExecutables++findExecutablesInDirectories ::+ [FilePath]+ -> ReadFilePathT IO [FilePath]+findExecutablesInDirectories =+ ReadFilePathT . D.findExecutablesInDirectories++findFile ::+ [FilePath]+ -> ReadFilePathT IO (Maybe FilePath)+findFile =+ ReadFilePathT . D.findFile++findFiles ::+ [FilePath]+ -> ReadFilePathT IO [FilePath]+findFiles =+ ReadFilePathT . D.findFiles++findFileWith ::+ ReadFilePathT IO Bool+ -> [FilePath]+ -> ReadFilePathT IO (Maybe FilePath)+findFileWith x ps =+ over _Wrapped (`D.findFileWith` ps) x++findFilesWith ::+ ReadFilePathT IO Bool+ -> [FilePath]+ -> ReadFilePathT IO [FilePath]+findFilesWith x ps =+ over _Wrapped (`D.findFilesWith` ps) x++createFileLink ::+ FilePath+ -> ReadFilePathT IO ()+createFileLink =+ ReadFilePathT . D.createFileLink++createDirectoryLink ::+ FilePath+ -> ReadFilePathT IO ()+createDirectoryLink =+ ReadFilePathT . D.createDirectoryLink++removeDirectoryLink ::+ ReadFilePathT IO ()+removeDirectoryLink =+ ReadFilePathT D.removeDirectoryLink++pathIsSymbolicLink ::+ ReadFilePathT IO Bool+pathIsSymbolicLink =+ ReadFilePathT D.pathIsSymbolicLink++getSymbolicLinkTarget ::+ ReadFilePathT IO FilePath+getSymbolicLinkTarget =+ ReadFilePathT D.getSymbolicLinkTarget++getPermissions ::+ ReadFilePathT IO Permissions+getPermissions =+ ReadFilePathT D.getPermissions++setPermissions ::+ Permissions+ -> ReadFilePathT IO ()+setPermissions p =+ ReadFilePathT (`D.setPermissions` p)++copyPermissions ::+ FilePath+ -> ReadFilePathT IO ()+copyPermissions =+ ReadFilePathT . D.copyPermissions++getAccessTime ::+ ReadFilePathT IO UTCTime+getAccessTime =+ ReadFilePathT D.getAccessTime++getModificationTime ::+ ReadFilePathT IO UTCTime+getModificationTime =+ ReadFilePathT D.getModificationTime++setAccessTime ::+ UTCTime+ -> ReadFilePathT IO ()+setAccessTime u =+ ReadFilePathT (`D.setAccessTime` u)++setModificationTime ::+ UTCTime+ -> ReadFilePathT IO ()+setModificationTime u =+ ReadFilePathT (`D.setModificationTime` u)
src/System/FilePath/FilePather/Find.hs view
@@ -2,15 +2,18 @@ {-# LANGUAGE NoImplicitPrelude #-} module System.FilePath.FilePather.Find(- findFiles+ findAllFiles , always , findFilesAlways+, findFilesBase+, findFilesBaseAlways ) where import Control.Applicative ( Applicative(liftA2, pure) ) import Control.Category ( Category(id) ) import Control.Lens ( view ) import Control.Monad ( join, Monad((>>=)) )+import Control.Monad.Reader.Class ( MonadReader(ask) ) import System.FilePath.FilePather.Posix ( (</>), FilePath, dropTrailingPathSeparator ) import System.IO ( IO )@@ -23,10 +26,10 @@ import System.FilePath.FilePather.ReadFilePath ( ReadFilePathT(..), readFilePath ) -findFiles ::+findAllFiles :: ReadFilePathT IO Bool -> ReadFilePathT IO [FilePath]-findFiles (ReadFilePathT test) =+findAllFiles (ReadFilePathT test) = let bool' :: Monad f => f a@@ -70,9 +73,22 @@ Applicative f => ReadFilePathT f Bool always =- ReadFilePathT (pure (pure True))+ pure True findFilesAlways :: ReadFilePathT IO [FilePath] findFilesAlways =- findFiles always+ findAllFiles always++findFilesBase ::+ ReadFilePathT IO Bool+ -> ReadFilePathT IO [FilePath]+findFilesBase r =+ do p <- ask+ z <- findAllFiles r+ pure (fmap (p </>) z)++findFilesBaseAlways ::+ ReadFilePathT IO [FilePath]+findFilesBaseAlways =+ findFilesBase always
src/System/FilePath/FilePather/Posix.hs view
@@ -51,8 +51,8 @@ import Data.String( String ) import Data.Bool( Bool ) import Data.Maybe ( Maybe )-import qualified System.FilePath as FP-import System.FilePath as SFP(FilePath, pathSeparator, pathSeparators, isPathSeparator, extSeparator, isExtSeparator, splitSearchPath, (-<.>), (</>))+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
src/System/FilePath/FilePather/ToFilePath.hs view
@@ -9,19 +9,18 @@ , toRead ) where +import Control.Applicative ( Applicative(pure, liftA2) ) import Control.Category ( Category((.)) )-import Control.Lens- ( view,- from,- iso,- Iso,- Iso',- Wrapped(..) )+import Control.Lens ( iso, Iso, Wrapped(..) ) import Data.Functor.Contravariant ( Contravariant(contramap) )+import Data.Either ( either )+import Data.Functor.Contravariant.Divisible+ ( Decidable(..), Divisible(..) ) import Data.Functor.Identity ( Identity(..) )-import System.FilePath ( FilePath )+import Data.Void ( absurd )+import System.FilePath ( (</>), FilePath ) import System.FilePath.FilePather.ReadFilePath- ( ReadFilePath, readFilePath )+ ( ReadFilePathT(..) ) newtype ToFilePathT f a = ToFilePathT (a -> f FilePath)@@ -41,6 +40,18 @@ contramap f (ToFilePathT g) = ToFilePathT (g . f) +instance Applicative f => Divisible (ToFilePathT f) where+ divide f (ToFilePathT g) (ToFilePathT h) =+ ToFilePathT (\x -> let (b, c) = f x in liftA2 (</>) (g b) (h c))+ conquer =+ ToFilePathT (pure (pure ""))++instance Applicative f => Decidable (ToFilePathT f) where+ choose f (ToFilePathT g) (ToFilePathT h) =+ ToFilePathT (either g h . f)+ lose f =+ ToFilePathT (absurd . f)+ toFilePath :: Iso (ToFilePath a)@@ -54,10 +65,13 @@ {-# INLINE toFilePath #-} toRead ::- Iso'- (ToFilePath FilePath)- (ReadFilePath FilePath)+ Iso+ (ToFilePathT f FilePath)+ (ToFilePathT f' FilePath)+ (ReadFilePathT f FilePath)+ (ReadFilePathT f' FilePath) toRead = iso- (view (toFilePath . from readFilePath))- (view (readFilePath . from toFilePath))+ (\(ToFilePathT x) -> ReadFilePathT x)+ (\(ReadFilePathT x) -> ToFilePathT x)+{-# INLINE toRead #-}