{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, MultiParamTypeClasses, FlexibleInstances, DeriveGeneric #-} module WorkerSample where import Control.Distributed.Process import Control.Distributed.Process.Serializable import Control.Distributed.Process.Closure import Control.Monad.IO.Class import Control.Monad import Text.Printf import Control.Concurrent import GHC.Generics (Generic) import Data.Binary import Data.Typeable import qualified Data.Map as Map import Data.Map (Map) class Send c a where (!) :: Serializable a => c -> a -> Process () instance Send ProcessId a where (!) = send instance Send (SendPort a) a where (!) = sendChan type Key = String -- should really use ByteString type Value = String data Request = Set Key Value | Get Key (SendPort (Maybe Value)) deriving (Typeable, Generic) instance Binary Request worker :: Process () worker = go Map.empty where go store = do r <- expect case r of Set k v -> go (Map.insert k v store) Get k port -> do port ! (Map.lookup k store) go store remotable ['worker]