Multithreaded relay in Haskell

-- |
-- Multithreaded relay in Haskell
-- //
-- Translated to Haskell by ERDI Gergo http://gergo.erdi.hu///

module Main where

import System.ZMQ
import Data.ByteString.Char8 (pack, unpack)
import Control.Concurrent (threadDelay, forkIO)

step1 :: Context -> IO ()
step1 context = do
-- Connect to step2 and tell it we're ready
withSocket context Pair $ \xmitter -> do
connect xmitter "inproc://step2"
send xmitter (pack "READY") []

step2 :: Context -> IO ()
step2 context = do
withSocket context Pair $ \receiver -> do
-- Bind inproc socket before starting step1
bind receiver "inproc://step2"
forkIO $ step1 context

-- Wait for signal and pass it on
msg <- receive receiver []

-- Connect to step3 and tell it we're ready
withSocket context Pair $ \xmitter -> do
connect xmitter "inproc://step3"
send xmitter msg []

main :: IO ()
main = withContext 1 $ \context -> do
-- Bind inproc socket before starting step2
withSocket context Pair $ \receiver -> do
bind receiver "inproc://step3"
forkIO $ step2 context

-- Wait for signal
msg <- receive receiver []
putStrLn $ unwords ["Test successful!", unpack msg]