yaml-rpc-0.3: Network/YAML/Balancer.hs
module Network.YAML.Balancer where
import System.Random
import qualified Data.ByteString.Char8 as BS
import Network.YAML.Types
-- | Select random server
selectRandom :: [(BS.ByteString, HostAndPort, Int)] -- ^ [(Service name, (hostname, port number), priority)]
-> BS.ByteString -- ^ Service name
-> IO HostAndPort
selectRandom lst service = do
let lst' = concatMap (\(name,srv,p) -> replicate p (name, srv)) lst
lst'' = map snd $ filter (\(name,srv) -> name==service) lst'
n = length lst''
k <- randomRIO (0, n-1)
return $ lst'' !! k