-- |
-- Module      : Network.Metric
-- Copyright   : (c) 2012 Brendan Hay <brendan@soundcloud.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan@soundcloud.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Network.Metric (
    -- * Exported Types
      SinkType(..)

    -- * Re-exports
    , Group
    , Bucket
    , Metric(..)
    , Measurable(..)
    , Encodable(..)
    , Sink(..)
    , AnyMeasurable(..)
    , AnySink(..)
    , open
    ) where

import Data.Data               (Data, Typeable)
import Network.Metric.Internal

import qualified Network.Metric.Sink.Ganglia  as GangliaSink
import qualified Network.Metric.Sink.Graphite as GraphiteSink
import qualified Network.Metric.Sink.Statsd   as StatsdSink
import qualified Network.Metric.Sink.Handle   as H

-- | An enumeration of supplied sink types
data SinkType =
      Ganglia
    | Graphite
    | Statsd
    | Stdout
      deriving (Data, Typeable, Show)

--
-- API
--

-- | Open a new sink specified by SinkType
open :: SinkType -> Host -> HostName -> PortNumber -> IO AnySink
open Ganglia  = GangliaSink.open
open Graphite = GraphiteSink.open
open Statsd   = StatsdSink.open
open Stdout   = \h _ _ -> return . AnySink $ H.SinkHandle h putStrLn