<div dir="ltr">The yesod-websockets library has a conduit api on top of websockets which I use, so I have conduits processing messages.  Conduit and pipes work similarly, so I suspect the technique from yesod-websockets will work fine for pipes, just look at the yesod-websockets source code:<br><br><a href="https://hackage.haskell.org/package/yesod-websockets-0.2.3/docs/Yesod-WebSockets.html">https://hackage.haskell.org/package/yesod-websockets-0.2.3/docs/Yesod-WebSockets.html</a><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 21, 2015 at 6:42 PM, Dimitri DeFigueiredo <span dir="ltr"><<a href="mailto:defigueiredo@ucdavis.edu" target="_blank">defigueiredo@ucdavis.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  

    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Hello All,<br>
    <br>
    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.<br>
    <br>
    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:<br>
    <br>
    
    --runClient :: String       -- ^ Host<br>
    --          -> Int          -- ^ Port<br>
    --          -> String       -- ^ Path<br>
    --          -> ClientApp a  -- ^ Client application --
    
    type ClientApp a = Connection -> IO a<br>
    --          -> IO a<br>
    <br>
    
    main :: IO ()<br>
    main = withSocketsDo $ runClient "<a href="http://echo.websocket.org" target="_blank">echo.websocket.org</a>" 80 "/" app<br>
    <br>
    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: <br>
    messageProducer :: Producer' WebsocketMessage IO ()<br>
    <br>
    But this does not run in the IO monad and at the same time I cannot
    get a 'Connection' object unless I use runClient.<br>
    <br>
    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.<br>
    <br>
    Has anyone done this before? Any suggestions on how to go about it?<br>
    <br>
    <br>
    Thanks,<br>
    <br>
    <br>
    Dimitri<br>
    <br>
    <br>
    <br>
  </div>

<br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>