module System.Socket.Internal.Message (
MessageFlags (..)
, Message
, IoVec
, msgEndOfRecord
, msgNoSignal
, msgOutOfBand
, msgWaitAll
) where
import Data.Bits
import Data.Monoid
import Data.Maybe
import Data.List (intersperse)
import Foreign.C.Types
import Foreign.Storable
newtype MessageFlags
= MessageFlags CInt
deriving (Eq, Bits, Storable)
data Message a t p
data IoVec
instance Monoid MessageFlags where
mempty = MessageFlags 0
mappend = (.|.)
instance Show MessageFlags where
show msg = "mconcat [" ++ y ++ "]"
where
x = [ if msg .&. msgEndOfRecord /= mempty then Just "msgEndOfRecord" else Nothing
, if msg .&. msgNoSignal /= mempty then Just "msgNoSignal" else Nothing
, if msg .&. msgOutOfBand /= mempty then Just "msgOutOfBand" else Nothing
, if msg .&. msgWaitAll /= mempty then Just "msgWaitAll" else Nothing
, let (MessageFlags i) = msg `xor` (mconcat [msgEndOfRecord,msgNoSignal,msgOutOfBand,msgWaitAll] .&. msg)
in if i /= 0 then Just ("MessageFlags " ++ show i) else Nothing
]
y = concat $ intersperse "," $ catMaybes x
msgEndOfRecord :: MessageFlags
msgEndOfRecord = MessageFlags (128)
msgNoSignal :: MessageFlags
msgNoSignal = MessageFlags (16384)
msgOutOfBand :: MessageFlags
msgOutOfBand = MessageFlags (1)
msgWaitAll :: MessageFlags
msgWaitAll = MessageFlags (256)