{-# 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

