{-# LANGUAGE TemplateHaskell #-} module Main where -- A simple word frequency counter using the task layer's mapreduce. import Remote import Control.Monad.Trans import Control.Monad import Debug.Trace type Line = String type Word = String mrMapper :: [Line] -> TaskM [(Word, Int)] mrMapper lines = return (concatMap (\line -> map (\w -> (w,1)) (words line)) lines) mrReducer :: (Word,[Int]) -> TaskM (Word,Int) mrReducer (w,p) = return (w,sum p) $( remotable ['mrMapper, 'mrReducer] ) myMapReduce = MapReduce { mtMapper = mrMapper__closure, mtReducer = mrReducer__closure, mtChunkify = chunkify 5, mtShuffle = shuffle } initialProcess "MASTER" = do args <- getCfgArgs case args of [filename] -> do file <- liftIO $ readFile filename ans <- runTask $ do mapReduce myMapReduce (lines file) say $ show ans _ -> say "When starting MASTER, please also provide a filename on the command line" initialProcess "WORKER" = receiveWait [] initialProcess _ = say "You need to start this program as either a MASTER or a WORKER. Set the appropiate value of cfgRole on the command line or in the config file." main = remoteInit (Just "config") [Main.__remoteCallMetaData] initialProcess