@@ -34,6 +34,7 @@ module Streamly.Internal.FileSystem.Dir
34 , readFiles
34 , readFiles
35 , readDirs
35 , readDirs
36 , readEither
36 , readEither
38 -- We can implement this in terms of readAttrsRecursive without losing
39 -- We can implement this in terms of readAttrsRecursive without losing
@@ -82,9 +83,11 @@ module Streamly.Internal.FileSystem.Dir
84import Control.Monad.IO.Class (MonadIO(..))
85import Control.Monad.IO.Class (MonadIO(..))
86+import Data.Bifunctor (bimap)
85import Data.Either (isRight, isLeft, fromLeft, fromRight)
87import Data.Either (isRight, isLeft, fromLeft, fromRight)
86import Streamly.Data.Stream (Stream)
88import Streamly.Data.Stream (Stream)
87import Streamly.Internal.Data.Unfold.Type (Unfold(..))
89import Streamly.Internal.Data.Unfold.Type (Unfold(..))
90+import System.FilePath ((</>))
89import qualified Streamly.Data.Unfold as UF
92import qualified Streamly.Data.Unfold as UF
90import qualified Streamly.Internal.Data.Unfold as UF (mapM2)
93import qualified Streamly.Internal.Data.Unfold as UF (mapM2)
@@ -288,13 +291,19 @@ toStream :: MonadIO m => String -> Stream m String
288toStream = read
291toStream = read
290-- | Read directories as Left and files as Right. Filter out "." and ".."
293-- | Read directories as Left and files as Right. Filter out "." and ".."
291−-- entries.
294+-- entries. The output contains the names of the directories and files.
293-- /Pre-release/
296-- /Pre-release/
294{-# INLINE readEither #-}
297{-# INLINE readEither #-}
295readEither :: MonadIO m => FilePath -> Stream m (Either FilePath FilePath)
298readEither :: MonadIO m => FilePath -> Stream m (Either FilePath FilePath)
296readEither = S.unfold eitherReader
299readEither = S.unfold eitherReader
301+-- | Like 'readEither' but prefix the names of the files and directories with
302+-- the supplied directory path.
303+{-# INLINE readEitherPaths #-}
304+readEitherPaths :: MonadIO m => FilePath -> Stream m (Either FilePath FilePath)
305+readEitherPaths dir = fmap (bimap (dir </>) (dir </>)) $ readEither dir
298{-# DEPRECATED toEither "Please use 'readEither' instead" #-}
307{-# DEPRECATED toEither "Please use 'readEither' instead" #-}
299{-# INLINE toEither #-}
308{-# INLINE toEither #-}
300toEither :: MonadIO m => FilePath -> Stream m (Either FilePath FilePath)
309toEither :: MonadIO m => FilePath -> Stream m (Either FilePath FilePath)