packages feed

remote-0.1: examples/tests/Test-Call.hs

{-# LANGUAGE TemplateHaskell,DeriveDataTypeable #-}
module Main where	

import Remote

import Control.Exception (throw)
import Data.Generics (Data)
import Data.Maybe (fromJust)
import Data.Typeable (Typeable)
import Control.Monad (when,forever)
import Control.Monad.Trans (liftIO)
import Data.Char (isUpper)
import Control.Concurrent (threadDelay)
import Data.Binary
import Control.Concurrent.MVar

sayHi :: ProcessId -> ProcessM ()
sayHi s = do liftIO $ threadDelay 500000
             say $ "Hi there, " ++ show s ++ "!"

add :: Int -> Int -> Int
add a b = a + b

badFac :: Integer -> Integer
badFac 0 = 1
badFac 1 = 1
badFac n = badFac (n-1) + badFac (n-2)

remotable ['sayHi, 'add, 'badFac]


while :: (Monad m) => m Bool -> m ()
while a = do f <- a
             when (f)
                (while a >> return ())
             return ()

initialProcess "MASTER" = do
              mypid <- getSelfPid
              mynode <- getSelfNode
              peers <- getPeers

              let slaves = findPeerByRole peers "SLAVE"
              case slaves of
                (somenode:_) -> 
                    do say $ "Running badFac on " ++show somenode
                       res <- callRemotePure somenode (badFac__closure 40)
                       say $ "Got result: " ++ show res
                _ -> say "Couldn't find a SLAVE node to run program on; start a SLAVE, then the MASTER"


              return ()
initialProcess "SLAVE" = receiveWait []
initialProcess _ = liftIO $ putStrLn "Please use parameter -cfgRole=MASTER or -cfgRole=SLAVE"

testSend = remoteInit (Just "config") [Main.__remoteCallMetaData] initialProcess

main = testSend