packages feed

remote-monad-0.2: examples/Main.hs

{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
 
module Main where

import Control.Natural (nat, run)
import Control.Remote.Monad
import Control.Remote.Monad.Packet.Weak

data Command :: * where
   Say :: String -> Command

data Procedure :: * -> * where
   Temperature :: Procedure Int

say :: String -> RemoteMonad Command Procedure ()
say s = command (Say s)

temperature :: RemoteMonad Command Procedure Int
temperature = procedure Temperature


runWP ::  WeakPacket Command Procedure a -> IO a 
runWP (Command (Say s))       = print s  
runWP (Procedure Temperature) = return 42

send :: RemoteMonad Command Procedure a -> IO a
send = run $ runMonad $ nat runWP

main :: IO ()
main = send $ do 
         say "Howdy doodly do"     
         say "How about a muffin?" 
         t <- temperature          
         say (show t ++ "F")