module Pipes.WebSockets where import Pipes import qualified Network.WebSockets as WS import Control.Monad.Trans.Reader (ReaderT , ask) -- TODO: Make some kind of 'runClientEffect' thing to wrap these things. -- | Transformer so that we can pass a connection to the output -- of these consumers/producers. type WebSocketsT = ReaderT WS.Connection -- | WebSockets Producer. Given some WebSocket connection, it will yield -- a single message that comes through. wsInOnce :: (MonadIO m, WS.WebSocketsData a) => Producer a (WebSocketsT m) () wsInOnce = do conn <- lift ask x <- liftIO (WS.receiveData conn) yield x -- | WebSockets Producer. Given some WebSocket connection, it will yield -- the messages that come through. wsIn :: (MonadIO m, WS.WebSocketsData a) => Producer a (WebSocketsT m) () wsIn = wsInOnce >> wsIn -- | WebSockets Consumer. Given some connection, it will send messages that -- are passed into it. wsOut :: (MonadIO m, WS.WebSocketsData a) => Consumer a (WebSocketsT m) () wsOut = do conn <- lift ask m <- await liftIO $ WS.sendTextData conn m