{-# LANGUAGE RankNTypes #-}
module Data.Conduit.Filesystem
( sourceDirectory
, sourceDirectoryDeep
) where
import Data.Conduit
import Control.Monad.Trans.Resource (MonadResource)
import Control.Monad.IO.Class (liftIO)
import System.FilePath ((</>))
import qualified Data.Streaming.Filesystem as F
-- | Stream the contents of the given directory, without traversing deeply.---- This function will return /all/ of the contents of the directory, whether-- they be files, directories, etc.---- Note that the generated filepaths will be the complete path, not just the-- filename. In other words, if you have a directory @foo@ containing files-- @bar@ and @baz@, and you use @sourceDirectory@ on @foo@, the results will be-- @foo/bar@ and @foo/baz@.---- Since 1.1.0sourceDirectory :: MonadResource m =>FilePath -> ProducermFilePathsourceDirectorydir =
bracketP (F.openDirStreamdir) F.closeDirStreamgo
where
gods =
loop
where
loop = do
mfp <- liftIO$F.readDirStreamds
case mfp of
Nothing -> return()Justfp -> do
yield$dir</>fploop-- | Deeply stream the contents of the given directory.---- This works the same as @sourceDirectory@, but will not return directories at-- all. This function also takes an extra parameter to indicate whether-- symlinks will be followed.---- Since 1.1.0sourceDirectoryDeep :: MonadResource m
=>Bool-- ^ Follow directory symlinks
-> FilePath-- ^ Root directory
-> ProducermFilePathsourceDirectoryDeepfollowSymlinks =
start
where
start :: MonadResource m =>FilePath -> ProducermFilePathstartdir = sourceDirectorydir=$=awaitForevergogo :: MonadResource m =>FilePath -> ProducermFilePathgofp = do
ft <- liftIO$F.getFileTypefp
case ft of
F.FTFile -> yieldfpF.FTFileSym -> yieldfpF.FTDirectory -> startfpF.FTDirectorySym
| followSymlinks -> startfp
| otherwise -> return()F.FTOther -> return()