Введите безопасный пример вызова RPC от клиента GHCJS к Yesod/Snap/Servant

У меня есть два связанных вопроса о вызове RPC для Yesod/Snap/Servant:

1) Скажем, у меня есть функция на сервере, написанная в Haskell, скомпилированная GHC:

add x y = x+y+42

как 1) Я вызываю эту функцию от клиента (клиент также написан в Haskell, скомпилирован с GHCJS) и 2) выполняет функцию на сервере и 3) возвращает результат клиенту?

Сделайте все это безопасным способом?

Итак, например, я хотел бы написать что-то вроде этого на клиенте:

main= putStrLn $ show $ add 2 3

чтобы функция добавления выполняла на сервере .

Каков самый простой способ сделать это с помощью Yesod/Snap/Servant на сервере и GHCJS на клиенте?

2) Аналогично, я хотел бы написать "функцию": getPhaseOfMoon :: IO Phase, который запускается на сервере, и я хотел бы вызвать getPhaseOfMoon из клиента безопасным способом.

Чтобы я мог написать это на клиенте:

main= do 
   p<-getPhaseOfMoon
   putStrLn $ show p
   return ()

Какой

1) переходит на сервер

2) сервер обращается к фазе луны

3) сервер возвращает Phase клиенту

4) клиент отображает фазу луны в Консоли JavaScript.

Как это сделать с помощью Yesod/Snap/Servant (сервер) + GHCJS (клиент)?