patterns-0.1.0: src/Network/Mom/Patterns/Basic/Pusher.hs
-------------------------------------------------------------------------------
-- |
-- Module : Network/Mom/Patterns/Basic/Pusher.hs
-- Copyright : (c) Tobias Schoofs
-- License : LGPL
-- Stability : experimental
-- Portability: non-portable
--
-- Pusher side of \'Pipeline\'
-------------------------------------------------------------------------------
module Network.Mom.Patterns.Basic.Pusher (
Pusher, withPusher, push)
where
import qualified System.ZMQ as Z
import Network.Mom.Patterns.Types
import Network.Mom.Patterns.Streams
------------------------------------------------------------------------
-- | The pusher data type
------------------------------------------------------------------------
newtype Pusher = Pusher {pipSock :: Z.Socket Z.Push}
------------------------------------------------------------------------
-- | The function in whose scope the pusher lives:
--
-- * 'Context' - The zeromq Context
--
-- * 'String' - The address
--
-- * 'LinkType' - Link type; usually, you want to bind
-- a pusher to its address
--
-- * ('Pusher' -> IO a) - Action in whose scope the pusher lives
------------------------------------------------------------------------
withPusher :: Context ->
String ->
LinkType ->
(Pusher -> IO a) -> IO a
withPusher ctx add lt act =
Z.withSocket ctx Z.Push $ \s -> link lt s add [] >> act (Pusher s)
------------------------------------------------------------------------
-- | Push a job down the pipeline;
-- the 'Source' creates the outgoing stream.
------------------------------------------------------------------------
push :: Pusher -> Source -> IO ()
push p = runSender (pipSock p)