yaml-rpc-0.1: Network/YAML/Balancer.hs
module Network.YAML.Balancer where
import System.Random
import qualified Data.ByteString.Char8 as BS
type Server = (BS.ByteString, Int)
-- | Select random server
selectRandom :: [(BS.ByteString, Server, Int)] -- ^ [(Service name, (hostname, port number), priority)]
-> BS.ByteString -- ^ Service name
-> IO Server
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