packages feed

cci-0.3.1: examples/Client.hs

--
-- Copyright (C) 2012 Parallel Scientific. All rights reserved.
--
-- See the accompanying LICENSE file for license information.
--

import Control.Exception     ( finally )
import Data.ByteString as B  ( empty )
import Data.ByteString.Char8 as B ( pack, putStrLn )
import System.Environment    ( getArgs )

import Network.CCI           ( withCCI, withPollingEndpoint, connect, ConnectionAttributes(..)
                             , pollWithEventData, EventData(..), disconnect, send
                             , unsafePackEventBytes
                             )


main :: IO ()
main = do
  [uri] <- getArgs
  withCCI$
    withPollingEndpoint Nothing$ \ep -> do
      connect ep uri empty CONN_ATTR_UU 0 Nothing
      _ <- loopWhileM id$ pollWithEventData ep$ \ev -> 
         case ev of

           EvConnect ctx (Right conn) ->
             do print ctx
                send conn (pack "ping!") 1
                return True

           EvRecv ebs conn -> flip finally (disconnect conn)$
             do unsafePackEventBytes ebs >>= B.putStrLn
                return False

           _ -> print ev >> return True
      
      return ()


-- | @loopWhileM p io@ performs @io@ repeteadly while its result satisfies @p@.
-- Yields the first offending result.
loopWhileM :: (a -> Bool) -> IO a -> IO a
loopWhileM p io = io >>= \a -> if p a then loopWhileM p io else return a