[Haskell-cafe] how to create a pipes producer from websockets?

Dimitri DeFigueiredo defigueiredo at ucdavis.edu
Wed Oct 21 23:42:29 UTC 2015

Hello All,

I am trying to use both the websockets library and the pipes library. 
They seem like a natural fit. However, I wanted to use the websockets 
library to build a pipes 'Producer' and that does not seem possible 
without some heavy lifting.

The websockets library does not give me a connection I can read from and 
write to. Instead, I need to supply an IO action (called a clientApp). 
And execute it using something like:

--runClient :: String       -- ^ Host
--          -> Int          -- ^ Port
--          -> String       -- ^ Path
--          -> ClientApp a  -- ^ Client application -- type ClientApp a 
= Connection -> IO a
--          -> IO a

main :: IO ()
main = withSocketsDo $ runClient "echo.websocket.org" 80 "/" app

The problem happens when you couple this restriction with the 
requirement that ClientApps have type 'Connection -> IO a'. Pipes 
producers are Monad transformer stacks. For example, I would like to 
build something like:
messageProducer :: Producer' WebsocketMessage IO ()

But this does not run in the IO monad and at the same time I cannot get 
a 'Connection' object unless I use runClient.

So, it seems I have a catch22 situation. Or have I overlooked something? 
I'd rather not have to do "un-lifting" on the monad transformer stack.

Has anyone done this before? Any suggestions on how to go about it?



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20151021/5030f229/attachment.html>

More information about the Haskell-Cafe mailing list