Bohtvaroh

Cloud Haskell Hello World

Jul 16th, 2013
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE UnicodeSyntax, DeriveDataTypeable #-}
  2.  
  3. import Control.Concurrent (threadDelay)
  4. import Control.Distributed.Process (Process, ProcessId, expect, getSelfPid, send)
  5. import Control.Distributed.Process.Node
  6.   (closeLocalNode, forkProcess, initRemoteTable, newLocalNode)
  7. import Control.Monad (forever)
  8. import Control.Monad.IO.Class (liftIO)
  9. import Network.Transport (closeTransport)
  10. import Network.Transport.TCP (createTransport, defaultTCPParameters)
  11.  
  12. sleepNS n = threadDelay (n * 1000000)
  13. sleep1s = sleepNS 1
  14.  
  15. ponger ∷ Process ()
  16. ponger = forever $ do
  17.   (pid, "ping") ← expect
  18.   liftIO $ putStr "ping … "
  19.   liftIO $ sleep1s
  20.   send pid "pong"
  21.  
  22. pinger ∷ ProcessId → Process ()
  23. pinger pongerPid = forever $ do
  24.   selfPid ← getSelfPid
  25.   send pongerPid (selfPid, "ping")
  26.   "pong" ← expect
  27.   liftIO $ putStrLn "pong"
  28.   liftIO $ sleep1s
  29.  
  30. main = do
  31.   Right transport1 ← createTransport "127.0.0.1" "10001" defaultTCPParameters
  32.   Right transport2 ← createTransport "127.0.0.1" "10002" defaultTCPParameters
  33.   node1 ← newLocalNode transport1 initRemoteTable
  34.   node2 ← newLocalNode transport2 initRemoteTable
  35.   pongerPid ← forkProcess node1 ponger
  36.   forkProcess node2 (pinger pongerPid)
  37.   liftIO $ sleepNS 10
  38.   closeLocalNode node1
  39.   closeTransport transport1
  40.   closeLocalNode node2
  41.   closeTransport transport2
Advertisement
Add Comment
Please, Sign In to add comment