packages feed

remote-0.1: examples/pi/Pi7.hs

{-# LANGUAGE TemplateHaskell #-}
module Main where

import Remote
import PiCommon
import Data.List (foldl')

worker :: Int -> Int -> TaskM (Int,Int)
worker count offset = 
   let (numin,numout) = countPairs offset count 
    in do tlogS "PI" LoInformation ("Finished mapper from offset "++show offset)
          return (numin,numout)

$( remotable ['worker] )

initialProcess :: String -> ProcessM ()
initialProcess "WORKER" =
  receiveWait []

initialProcess "MASTER" = 
  let
        interval = 1000000
        numworkers = 5
        numberedworkers = take numworkers [0,interval..]
        clos = map (worker__closure interval) numberedworkers
  in runTask $ 
        do proms <- mapM newPromise clos
           res <- mapM readPromise proms
           let (sumx,sumy) = foldl' (\(a,b) (c,d) -> (a+c,b+d)) (0,0) res
           let (num,den) = estimatePi (fromIntegral sumx) (fromIntegral sumy)
           tsay ("Done: " ++ longdiv (num) (den) 20)
  where 
    estimatePi ni no | ni + no == 0 = (0,0)
                     | otherwise = (4 * ni , ni+no)

initialProcess _ = error "Role must be WORKER or MASTER"

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