zeromq4-haskell 0.4.1 → 0.5
raw patch · 6 files changed
+93/−20 lines, 6 filesdep +tasty-hunit
Dependencies added: tasty-hunit
Files
- CHANGELOG.md +34/−0
- src/System/ZMQ4.hs +38/−16
- src/System/ZMQ4/Internal.hs +2/−2
- src/System/ZMQ4/Monadic.hs +5/−1
- tests/System/ZMQ4/Test/Properties.hs +11/−0
- zeromq4-haskell.cabal +3/−1
+ CHANGELOG.md view
@@ -0,0 +1,34 @@+0.5+-----------------------------------------------------------------------------+- bugfix release (#44, PR #47) which exposes `DontWait` flag on Windows+- exports `socketMonitor`+- `Eq`, `Typable` and `Generic` instances of socket types++0.4.1+-----------------------------------------------------------------------------+- adjust dependencies constraints++0.4+-----------------------------------------------------------------------------+- update `exceptions` and rework tests++0.3.2+-----------------------------------------------------------------------------+- adjust dependencies constraints++0.3.1+-----------------------------------------------------------------------------+- preliminary Windows support (#8)++0.3+-----------------------------------------------------------------------------+- remove `MonadCatchIO-transformers`+- use `pkg-config` (except on Windows)++0.2+-----------------------------------------------------------------------------+- add `disconnect`++0.1+-----------------------------------------------------------------------------+- initial release supporting 0MQ 4.x
src/System/ZMQ4.hs view
@@ -1,5 +1,7 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE GADTs #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-} -- | -- Module : System.ZMQ4@@ -60,7 +62,7 @@ , Size , Context , Socket- , Flag (SendMore)+ , Flag (..) , Switch (..) , Timeout , Event (..)@@ -84,6 +86,7 @@ , receiveMulti , version , monitor+ , socketMonitor , poll , System.ZMQ4.subscribe@@ -212,6 +215,7 @@ import Data.List.NonEmpty (NonEmpty) import Data.Restricted import Data.Traversable (forM)+import Data.Typeable import Foreign hiding (throwIf, throwIf_, throwIfNull, void) import Foreign.C.String import Foreign.C.Types (CInt, CShort)@@ -227,45 +231,46 @@ import qualified System.ZMQ4.Base as B import GHC.Conc (threadWaitRead, threadWaitWrite)+import GHC.Generics(Generic) ----------------------------------------------------------------------------- -- Socket Types -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_PAIR>-data Pair = Pair+data Pair = Pair deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_PUB>-data Pub = Pub+data Pub = Pub deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_SUB>-data Sub = Sub+data Sub = Sub deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_XPUB>-data XPub = XPub+data XPub = XPub deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_XSUB>-data XSub = XSub+data XSub = XSub deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_REQ>-data Req = Req+data Req = Req deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_REP>-data Rep = Rep+data Rep = Rep deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_DEALER>-data Dealer = Dealer+data Dealer = Dealer deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_ROUTER>-data Router = Router+data Router = Router deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_PULL>-data Pull = Pull+data Pull = Pull deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_PUSH>-data Push = Push+data Push = Push deriving (Eq, Typeable, Generic) -- | <http://api.zeromq.org/4-0:zmq-socket ZMQ_STREAM>-data Stream = Stream+data Stream = Stream deriving (Eq, Typeable, Generic) type XReq = Dealer {-# DEPRECATED XReq "Use Dealer" #-}@@ -790,7 +795,11 @@ send sock fls val = bracket (messageOf val) messageClose $ \m -> onSocket "send" sock $ \s -> retry "send" (waitWrite sock) $+#ifdef mingw32_HOST_OS+ c_zmq_sendmsg s (msgPtr m) (combineFlags fls)+#else c_zmq_sendmsg s (msgPtr m) (combineFlags (DontWait : fls))+#endif -- | Send the given 'LB.ByteString' over the socket -- (cf. <http://api.zeromq.org/4-0:zmq-sendmsg zmq_sendmsg>).@@ -806,7 +815,11 @@ send' sock fls val = bracket (messageOfLazy val) messageClose $ \m -> onSocket "send'" sock $ \s -> retry "send'" (waitWrite sock) $+#ifdef mingw32_HOST_OS+ c_zmq_sendmsg s (msgPtr m) (combineFlags fls)+#else c_zmq_sendmsg s (msgPtr m) (combineFlags (DontWait : fls))+#endif -- | Send a multi-part message. -- This function applies the 'SendMore' 'Flag' between all message parts.@@ -828,7 +841,11 @@ receive sock = bracket messageInit messageClose $ \m -> onSocket "receive" sock $ \s -> do retry "receive" (waitRead sock) $+#ifdef mingw32_HOST_OS+ c_zmq_recvmsg s (msgPtr m) 0+#else c_zmq_recvmsg s (msgPtr m) (flagVal dontWait)+#endif data_ptr <- c_zmq_msg_data (msgPtr m) size <- c_zmq_msg_size (msgPtr m) SB.packCStringLen (data_ptr, fromIntegral size)@@ -873,7 +890,12 @@ where next soc m False = messageClose m `finally` close soc >> return Nothing next soc m True = onSocket "recv" soc $ \s -> do- retry "recv" (waitRead soc) $ c_zmq_recvmsg s (msgPtr m) (flagVal dontWait)+ retry "recv" (waitRead soc) $+#ifdef mingw32_HOST_OS+ c_zmq_recvmsg s (msgPtr m) 0+#else+ c_zmq_recvmsg s (msgPtr m) (flagVal dontWait)+#endif ptr <- c_zmq_msg_data (msgPtr m) evt <- peek ptr str <- receive soc
src/System/ZMQ4/Internal.hs view
@@ -81,7 +81,7 @@ -- | Flags to apply on send operations (cf. man zmq_send) data Flag =- DontWait -- ^ ZMQ_DONTWAIT+ DontWait -- ^ ZMQ_DONTWAIT (Only relevant on Windows.) | SendMore -- ^ ZMQ_SNDMORE deriving (Eq, Ord, Show) @@ -257,7 +257,7 @@ peek sPtr >>= \len -> peekA (bPtr, fromIntegral len) getStrOpt :: Socket a -> ZMQOption -> IO String-getStrOpt = getCStrOpt peekCStringLen+getStrOpt = getCStrOpt (peekCString . fst) getByteStringOpt :: Socket a -> ZMQOption -> IO SB.ByteString getByteStringOpt = getCStrOpt SB.packCStringLen
src/System/ZMQ4/Monadic.hs view
@@ -17,7 +17,7 @@ ( -- * Type Definitions ZMQ , Socket- , Z.Flag (SendMore)+ , Z.Flag (..) , Z.Switch (..) , Z.Timeout , Z.Event (..)@@ -79,6 +79,7 @@ , unsubscribe , proxy , monitor+ , socketMonitor , Z.poll -- * Socket Options (Read)@@ -348,6 +349,9 @@ monitor :: [Z.EventType] -> Socket z t -> ZMQ z (Bool -> IO (Maybe Z.EventMsg)) monitor es s = onContext $ \ctx -> Z.monitor es ctx (_unsocket s)++socketMonitor :: [Z.EventType] -> String -> Socket z t -> ZMQ z ()+socketMonitor es addr s = liftIO $ Z.socketMonitor es addr (_unsocket s) -- * Socket Options (Read)
tests/System/ZMQ4/Test/Properties.hs view
@@ -8,6 +8,7 @@ import Test.QuickCheck import Test.QuickCheck.Monadic (monadicIO, run) import Test.Tasty+import Test.Tasty.HUnit import Test.Tasty.QuickCheck import Control.Applicative@@ -49,6 +50,7 @@ , testProperty "set;get socket option (Pull)" (prop_set_get_socket_option Pull) , testProperty "set;get socket option (Push)" (prop_set_get_socket_option Push) , testProperty "(un-)subscribe" (prop_subscribe Sub)+ , testCase "last_enpoint" (last_endpoint) , testGroup "connect disconnect" [ testProperty "" (prop_connect_disconnect x) | x <- [ (AnySocket Rep, AnySocket Req)@@ -100,6 +102,15 @@ where ieq :: (Integral i, Integral k) => i -> k -> Bool ieq i k = (fromIntegral i :: Int) == (fromIntegral k :: Int)++last_endpoint :: IO ()+last_endpoint = do+ let a = "tcp://127.0.0.1:43821"+ a' <- runZMQ $ do+ s <- socket Rep+ bind s a+ lastEndpoint s+ a @=? a' prop_subscribe :: (Subscriber a, SocketType a) => a -> ByteString -> Property prop_subscribe t subs = monadicIO $ run $
zeromq4-haskell.cabal view
@@ -1,5 +1,5 @@ name: zeromq4-haskell-version: 0.4.1+version: 0.5 synopsis: Bindings to ZeroMQ 4.x category: System, FFI license: MIT@@ -14,6 +14,7 @@ build-type: Simple extra-source-files: README.md+ , CHANGELOG.md , AUTHORS , examples/*.hs , examples/Makefile@@ -80,4 +81,5 @@ , bytestring , QuickCheck >= 2.6 , tasty >= 0.8+ , tasty-hunit >= 0.8 , tasty-quickcheck >= 0.8