Synchronized publisher in Haskell

{-# LANGUAGE OverloadedStrings #-}

-- Synchronized publisher

module Main where

import Control.Monad
import System.ZMQ4.Monadic

subscribers_expected :: Int
subscribers_expected = 10

main :: IO ()
main = runZMQ $ do
-- Socket to talk to clients
publisher <- socket Pub
setSendHighWM (restrict 1100000) publisher
bind publisher "tcp://*:5561"

-- Socket to receive signals
syncservice <- socket Rep
bind syncservice "tcp://*:5562"

-- Get synchronization from subscribers
liftIO $ putStrLn "Waiting for subscribers"
replicateM_ subscribers_expected $ do
receive syncservice
send syncservice [] ""

-- Now broadcast exactly 1M updates followed by END
liftIO $ putStrLn "Broadcasting messages"
replicateM_ 1000000 (send publisher [] "Rhubarb")
send publisher [] "END"