module Main (main) where
import Data.Bifunctor (bimap)
import Data.Function ((&))
import Streamly.Prelude (SerialT)
import System.IO (stdout, hSetBuffering, BufferMode(LineBuffering))
import qualified Streamly.Prelude as Stream
import qualified Streamly.Internal.Data.Stream.IsStream as Stream
(iterateMapLeftsWith)
import qualified Streamly.Internal.FileSystem.Dir as Dir (toEither)
-- Lists a dir as a stream of (Either Dir File)
listDir :: String -> SerialT IO (Either String String)
listDir dir =
Dir.toEither dir -- SerialT IO (Either String String)
& Stream.map (bimap mkAbs mkAbs) -- SerialT IO (Either String String)
where mkAbs x = dir ++ "/" ++ x
-- | List the current directory recursively using concurrent processing
main :: IO ()
main = do
hSetBuffering stdout LineBuffering
let start = Stream.fromPure (Left ".")
Stream.iterateMapLeftsWith Stream.ahead listDir start
& Stream.mapM_ print