{-|
Module      : Pulsar
Description : Apache Pulsar client
License     : Apache-2.0
Maintainer  : gabriel.volpe@chatroulette.com
Stability   : experimental

Consider the following imports (needs the [async](http://hackage.haskell.org/package/async) library).

@
import           Control.Concurrent             ( threadDelay )
import           Control.Concurrent.Async       ( concurrently_ )
import           Control.Monad                  ( forever )
import           Pulsar
@

A quick example of a consumer and producer running concurrently.

@
resources :: Pulsar (Consumer IO, Producer IO)
resources = do
  ctx      <- connect defaultConnectData
  consumer <- newConsumer ctx topic "test-sub"
  producer <- newProducer ctx topic
  return (consumer, producer)
@

A Pulsar connection, consumers, and producers are long-lived resources that are managed accordingly for you. Once the program exits, the resources will be released in the respective order (always opposite to the order of acquisition).

@
main :: IO ()
main = runPulsar resources $ \(Consumer {..}, Producer {..}) ->
  let c = forever $ fetch >>= \(Message i m) -> print m >> ack i
      p = forever $ threadDelay (5 * 1000000) >> produce "hello world"
  in  concurrently_ c p
@
-}
module Pulsar
  ( connect
  , defaultConnectData
  , newConsumer
  , newProducer
  , runPulsar
  , runPulsar'
  , Consumer(..)
  , Producer(..)
  , Pulsar
  , PulsarCtx
  , ConnectData
  , LogLevel(..)
  , LogOptions(..)
  , LogOutput(..)
  , module Pulsar.Types
  )
where

import           Pulsar.Connection
import           Pulsar.Consumer
import           Pulsar.Internal.Core
import           Pulsar.Producer
import           Pulsar.Types