-- ----------------------------------------------------------------------------
{- |
  Module     : Holumbus.MapReduce.MapReduce
  Copyright  : Copyright (C) 2008 Stefan Schmidt
  License    : MIT

  Maintainer : Stefan Schmidt (stefanschmidt@web.de)
  Stability  : experimental
  Portability: portable
  Version    : 0.1


-}
-- ----------------------------------------------------------------------------

module Holumbus.MapReduce.MapReduce
(
  MapReduceType(..)
, MapReduce(..)
)
where

import           Holumbus.Common.Debug
import           Holumbus.FileSystem.FileSystem
import           Holumbus.MapReduce.Types
import           Holumbus.Network.Site


data MapReduceType = MRTMaster | MRTWorker | MRTClient | MRTStandalone
  deriving (Show, Eq, Ord, Enum)
  

class (Debug mr) => MapReduce mr where
  
  closeMapReduce :: mr -> IO ()
  
  -- | prints the siteId of the MapReduce instance 
  getMySiteId :: mr -> IO SiteId
  
  -- | get the Type of the MapReduce instance
  getMapReduceType :: mr -> IO MapReduceType
  
  -- | get the Controlling-Type (normal or singlestep) of the MapReduce instance
  startControlling :: mr -> IO ()

  -- | get the Controlling-Type (normal or singlestep) of the MapReduce instance
  stopControlling :: mr -> IO ()

  -- | test, if Controller is running
  isControlling :: mr -> IO Bool
  
  -- | performs a single step of the controller (if mode is singlestep)
  doSingleStep :: mr -> IO ()
  
  -- | starts a MapReduce-Job (blocking while finished)
  doMapReduceJob :: JobInfo -> mr -> IO JobResult
  
  doMapReduce
    :: ActionConfiguration a k1 v1 k2 v2 v3 v4
    -> a               -- ^ options
    -> [(k1,v1)]       -- ^ input (Tuples)
    -> [FileId]        -- ^ input (Files)
    -> Int             -- ^ number of splitters
    -> Int             -- ^ number of mappers
    -> Int             -- ^ number of reducers
    -> Int             -- ^ number of results
    -> TaskOutputType  -- ^ type of the result (file of raw)
    -> mr -> IO ([(k2,v4)],[FileId])
  doMapReduce c o ls1 ls2 sc mc rc nor rt mr
    = do
      let ji = createJobInfoFromConfiguration c o ls1 ls2 sc mc rc nor rt
      jr <- doMapReduceJob ji mr
      let res = createListsFromJobResult c jr
      return res