content: -- |
  -- 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]
  