{-# LANGUAGE ForeignFunctionInterface, DeriveDataTypeable #-}
-- |
-- Module: Nanomsg.Binary
--
-- This module offers a thin serialization layer ("Binary" based)
-- over @'send'@ and @'receive'@. You just need to import
-- @Nanomsg.Binary@ instead of @Nanomsg@.
module Nanomsg.Binary
(
-- * Types
-- ** Socket types
Pair(..)
, Req(..)
, Rep(..)
, Pub(..)
, Sub(..)
, Surveyor(..)
, Respondent(..)
, Push(..)
, Pull(..)
, Bus(..)
-- ** Other
, Socket
, Endpoint
, NNException
-- , eTERM
-- , eFSM
, SocketType
, Sender
, Receiver
-- * Operations
-- ** General operations
, socket
, withSocket
, bind
, connect
, send
, recv
, recv'
, subscribe
, unsubscribe
, shutdown
, close
, term
-- ** Socket option settings
, linger
, setLinger
, sndBuf
, setSndBuf
, rcvBuf
, setRcvBuf
, reconnectInterval
, setReconnectInterval
, reconnectIntervalMax
, setReconnectIntervalMax
, sndPrio
, setSndPrio
, ipv4Only
, setIpv4Only
, requestResendInterval
, setRequestResendInterval
, surveyorDeadline
, setSurveyorDeadline
, tcpNoDelay
, setTcpNoDelay
) where
import Control.Applicative
import Nanomsg hiding (send,recv,recv')
import qualified Nanomsg as NM
import Data.Binary
import Data.ByteString.Lazy
send
:: (Sender s, Binary dat)
=> Socket s
-> dat
-> IO ()
send s d = NM.send s (toStrict . encode $ d)
recv
:: (Receiver s, Binary dat)
=> Socket s
-> IO dat
recv s = decode . fromStrict <$> NM.recv s
recv'
:: (Receiver s, Binary dat)
=> Socket s
-> IO (Maybe dat)
recv' s = fmap (decode . fromStrict) <$> NM.recv' s