Dimitry Golubovsky wrote: > John & all, > > I use HSH in my project where several external programs and Haskell > functions need to be piped together: HSH is of great help here. > > I however came across the situation when one of pipe-connected > functions has signature IO (), yet it reads from stdin* and writes to > stdout. > > The documentation mentions "instance ShellCommand (Handle -> Handle -> > IO ())" which could be of some help, but in the latest version of HSH > on Hackage this instance is commented out. > > What was the reason of doing that? Is this to be expected in the > upcoming versions?
Yes; that's due to the new more flexible way of sending data between processes in HSH -- the Channel. You can replace it with a function that can take any Channel, and produce a result as a Channel of one particular sort. In particular, this instance: instance ShellCommand (Channel -> IO Channel) where is the direct replacement for what you were doing. A Channel is generally a String, a lazy ByteString, or a Handle. There are helper functions in HSH.Channel to deal with these: chanAsString, chanAsBSL, and chanToHandle. You can think of the first two as similar to hGetContents. The last will write the channel out literally to a passed-along handle. So, let's say that you wanted to process input as a String, and before you were given a Handle that you used hGetContents on. Now, you will get a Channel, on which you will call chanAsString. It will convert whatever type of Channel you were handed into a String, lazily. Does that make sense? _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
