packages feed

zmcat-0.2: src/Network/Zmcat.hs

module Network.Zmcat where

import System.ZMQ3
import Control.Monad (forever)
import qualified Data.ByteString as BS
import Data.ByteString.Char8 (pack, unpack)
import System.IO

runCtx :: SocketType a1 => a1 -> (Socket a1 -> IO a) -> IO a
runCtx t blk = withContext $ \ctx -> do
        withSocket ctx t $ \skt -> do
            blk skt

pub :: String -> String -> IO a
pub uri k = runCtx Pub $ \skt -> do
        bind skt uri
        forever $ do
            pkt <- hGetLine stdin
            send skt [] (pack $ k ++ pkt)

sub :: String -> BS.ByteString -> IO a
sub uri k = runCtx Sub $ \skt -> do
        subscribe skt k
        connect skt uri
        forever $ do
            line <- receive skt
            putStrLn $ drop (BS.length k) (unpack line)
            hFlush stdout
                
pull :: String -> IO a
pull uri = runCtx Pull $ \skt -> do
        bind skt uri
        forever $ do
            line <- receive skt
            putStrLn $ unpack line
            hFlush stdout

push :: String -> IO a
push uri = runCtx Push $ \skt -> do
        connect skt uri
        forever $ do
            pkt <- hGetLine stdin
            send skt [] (pack pkt)

rep :: String -> IO a
rep uri = runCtx Rep $ \skt -> do
    bind skt uri
    forever $ do
        line <- receive skt
        putStrLn $ unpack line
        hFlush stdout
        pkt <- hGetLine stdin
        send skt [] (pack pkt)

req :: String -> IO a
req uri = runCtx Req $ \skt -> do
    connect skt uri
    forever $ do
        pkt <- hGetLine stdin
        send skt [] (pack pkt)
        line <- receive skt
        putStrLn $ unpack line
        hFlush stdout