简体   繁体   中英

how to insert an IO operation into a Pipe

I have a Haskell function which given a directory from which to get recursively all files and writes the filenames into a file. This is a simple example to start with. In the next step I must replace the mapping from file to a text (the transf operation) by an operation using the file content; this is obviously an operation in the IO monad.

My understanding of Pipe is very limited; I tried with a simplistic operation opex which I tried to lift into a pipe. I want to remove the current transf

This looks like a simple problem but despite of searching the web, I cannot find a solution. Thank you for help!

pipedDoIO2 :: Path Abs File -> Path Abs Dir -> (Path Abs File -> IO Text) -> ErrIO ()
pipedDoIO2 file path transf =  do
    hand <-   openFile2handle file WriteMode
    Pipe.runEffect $
                getRecursiveContents path
                >-> PipePrelude.map ( transf)  -- some IO type left?
                -- >-> lift opex 
                >-> PipePrelude.toHandle hand    
    closeFile2 hand
    return ()

opex :: (Path Abs File -> IO Text)
opex = return . showT 

Some more reading lead me to the simple answer: use mapM from the Path.Prelude. I hope this solution helps others to find this "obvious" solution not easily detected on the web; I added a filter on the file extension as an example how to use filter .

Caveat: the toHandle "Write Strings to a Handle using hPutStrLn", ie it inserts a \n after each insertion.

-- a convenient function to go through a directory and 
-- recursively apply a function to each file or directory
-- filters for extension md
pipedDoIO2 :: Path Abs File -> Path Abs Dir -> (Path Abs File -> ErrIO String) -> ErrIO ()
pipedDoIO2 file path opex =  do
    hand <-   openFile2handle file WriteMode
    Pipe.runEffect $
                getRecursiveContents path
                >-> PipePrelude.filter (hasExtension (Extension "md"))
                >-> PipePrelude.mapM opex 
                >-> PipePrelude.toHandle hand    
    closeFile2 hand
    return ()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM