Synchronized subscriber in Haskell

{-# LANGUAGE OverloadedStrings #-}

-- Synchronized subscriber

module Main where

import Control.Concurrent
import Data.Function
import System.ZMQ4.Monadic
import Text.Printf

main :: IO ()
main = runZMQ $ do
-- First, connect our subscriber socket
subscriber <- socket Sub
connect subscriber "tcp://localhost:5561"
subscribe subscriber ""

-- 0MQ is so fast, we need to wait a while…
liftIO $ threadDelay 1000000

-- Second, synchronize with the publisher
syncclient <- socket Req
connect syncclient "tcp://localhost:5562"

-- Send a synchronization request
send syncclient [] ""

-- Wait for a synchronization reply
receive syncclient

let -- go :: (Int -> ZMQ z Int) -> Int -> ZMQ z Int
go loop = \n -> do
string <- receive subscriber
if string == "END"
then return n
else loop (n+1)

-- Third, get our updates and report how many we got
update_nbr <- fix go (0 :: Int)
liftIO $ printf "Received %d updates\n" update_nbr