{-# LANGUAGE RankNTypes #-} module Network.RPC where import Data.ByteString (ByteString) data MessageClass = Error | Query | Response deriving (Eq,Ord,Enum,Bounded,Show,Read) data Messaging msg tid payload = Messaging { messageClass :: forall a. msg a -> MessageClass , messageTransaction :: forall a. msg a -> tid , messagePayload :: forall a. msg a -> a , encodePayload :: msg payload -> msg ByteString , decodePayload :: msg ByteString -> Either String (msg payload) }