packages feed

yaml-rpc-0.1: TestCall.hs

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
-- | Test client
module Main where

import Data.Object.Yaml
import Data.Convertible.Base

import Network.YAML

import TestTypes
import qualified Methods

-- declare `double', `mySum' and `ls' as RPC methods
$(remote 'Methods.double)
$(remote 'Methods.mySum)
$(remote 'Methods.ls)
-- For example, `ls' is defined in Methods.hs as
-- ls :: String -> IO [String]
-- Now `ls' is defined here as
-- ls :: (ByteString,Int) -> String -> IO [String]

rules = [("test", ("127.0.0.1", 5000), 1),
         ("test", ("127.0.0.1", 5001), 1),
         ("test", ("127.0.0.1", 5002), 1)]

getService = selectRandom rules

p = Point 2.0 3.0

ps = [Point 3.0 5.0, Point 1.0 2.1, Point 0.1 0.2]

main = do
  test <- getService "test"

  -- call remote functions
  r <- double test p
  print r
  s <- mySum test [3.5, 5.5, 1.0]
  print s
  lst <- ls test "/tmp"
  print lst

  -- call remote functions for many arguments, for each argument on different server maybe
  rs <- callP getService "test" "double" ps
  print (rs :: [Point])
  cs <- callP getService "test" "counter" $ zip ([3,4,5,6] :: [Int]) ([1..] :: [Int])
  print (cs :: [Int])