{-# LANGUAGE Rank2Types #-}
--------------------------------------------------------------------------------
-- |
-- Module : Network.Service
-- Copyright : (c) Moritz Angermann 2014
-- License : MIT
--
-- Maintainer : moritz@lichtzwerge.de
-- Stability : stable
-- Portability : portable
--
-- A service is an endpoint that can receive and send messages.
--
--------------------------------------------------------------------------------
module Network.Service where
import Data.ByteString (ByteString)
-- | Services operate on Messages, the ServiceMessage class abstracts
-- the serialization.
class ServiceMessage a where
toBS :: a -> ByteString -- ^ serialization to ByteString representation
fromBS :: ByteString -> a -- ^ deserialization from ByteString representation
-- | A Service of a certain Message data.
data Service a = Service
{ sDone :: IO Bool -- ^ tells whether the service is done or not.
, sRecv :: IO a -- ^ receive a message.
, sSend :: a -> IO () -- ^ send a message.
, sTerm :: IO () -- ^ terminate the service.
}
-- | A handler takes a service and returns an IO action.
-- The idea is that a service handler will 'run' a service
--
-- a simple echo handler might look like the following:
--
-- > handler service = do { msg <- sRecv service
-- > ; sSend service msg
-- > ; isDone <- sDone service
-- > ; unless isDone (handler service)
-- > }
type ServiceHandler a = Service a -> IO ()