haskell-examples/conduitFileStream.hs
2025-06-24 23:16:05 +00:00

37 lines
1.1 KiB
Haskell

-- Copyright © 2025 Hashirama Senju
{-
find dictionaries by using only conduits.
-}
{-# LANGUAGE OverloadedStrings #-}
module Main where
import qualified Data.Conduit.Combinators as CC
import Data.Conduit
import Data.Text (pack,unpack)
import System.Environment (getArgs)
import System.IO (stdout)
import System.FilePath (takeExtension)
import Conduit
-- | Recursively list all files in the given directory, streaming each file path as UTF-8 bytes to stdout.
listFiles :: FilePath -> IO ()
listFiles dir = runConduitRes $
-- 1) Walk the directory (produces `FilePath`)
CC.sourceDirectoryDeep False dir
.| -- 2) Filter *before* converting to Text
filterC (\fp -> takeExtension fp == ".mdx")
.| -- 3) Convert to Text, append newline, then encode
CC.map (\fp -> pack fp <> "\n")
.| CC.encodeUtf8
.| CC.sinkHandle stdout
-- | Entry point: use first CLI argument as directory, defaulting to current directory.
main :: IO ()
main = do
args <- getArgs
let targetDir = case args of
(d:_) -> d
[] -> "."
listFiles targetDir