module Control.Distributed.Raketka.Master where
import Data.Tagged
import Control.Distributed.Process as P
import Control.Monad
import Control.Distributed.Process.Backend.SimpleLocalnet
import Control.Distributed.Raketka.Type.Arg as T
import Control.Distributed.Raketka.Type.Server
import Control.Distributed.Raketka.NodeId as N
master::Specific tag ps s c =>
Backend
-> Cluster
-> Tagged tag Int
-> s
-> Process ()
master backend0 (Cluster ids0) idx1@(Tagged idx0) state0 = do
mynode1 <- getSelfNode
let peers1 = N.nodeId <$> ids0
this1 = ids0 !! idx0
service1 = T.service this1
peers2 = filter (/= mynode1) peers1
mypid1 <- getSelfPid
register service1 mypid1
forM_ peers2 $ \(peer1::NodeId) -> P.whereisRemoteAsync peer1 service1
startServer (passTag idx1 this1) state0