content: {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  
  module System.Metrics.Prometheus.RegistryT where
  
  import Control.Applicative ((<$>))
  import Control.Monad.IO.Class (MonadIO, liftIO)
  import Control.Monad.Trans.Class (MonadTrans)
  import Control.Monad.Trans.State.Strict (
      StateT (..),
      evalStateT,
      execStateT,
      get,
   )
  
  import System.Metrics.Prometheus.Metric.Counter (Counter)
  import System.Metrics.Prometheus.Metric.Gauge (Gauge)
  import System.Metrics.Prometheus.Metric.Histogram (Histogram)
  import qualified System.Metrics.Prometheus.Metric.Histogram as Histogram
  import System.Metrics.Prometheus.MetricId (
      Labels,
      MetricId,
      Name,
   )
  import System.Metrics.Prometheus.Registry (
      Registry,
      RegistrySample,
      new,
   )
  import qualified System.Metrics.Prometheus.Registry as R
  
  
  newtype RegistryT m a = RegistryT {unRegistryT :: StateT Registry m a}
      deriving (Monad, MonadTrans, Applicative, Functor, MonadIO)
  
  
  evalRegistryT :: Monad m => RegistryT m a -> m a
  evalRegistryT = flip evalStateT new . unRegistryT
  
  
  execRegistryT :: Monad m => RegistryT m a -> m Registry
  execRegistryT = flip execStateT new . unRegistryT
  
  
  runRegistryT :: Monad m => RegistryT m a -> m (a, Registry)
  runRegistryT = flip runStateT new . unRegistryT
  
  
  withRegistry :: MonadIO m => (Registry -> m (a, Registry)) -> RegistryT m a
  withRegistry = RegistryT . StateT
  
  
  registerCounter :: MonadIO m => Name -> Labels -> RegistryT m Counter
  registerCounter n l = withRegistry (liftIO . R.registerCounter n l)
  
  
  registerGauge :: MonadIO m => Name -> Labels -> RegistryT m Gauge
  registerGauge n l = withRegistry (liftIO . R.registerGauge n l)
  
  
  registerHistogram :: MonadIO m => Name -> Labels -> [Histogram.UpperBound] -> RegistryT m Histogram
  registerHistogram n l u = withRegistry (liftIO . R.registerHistogram n l u)
  
  
  removeMetric :: MonadIO m => MetricId -> RegistryT m ()
  removeMetric i = withRegistry (pure . (,) () . R.removeMetric i)
  
  
  listMetricIds :: MonadIO m => RegistryT m [MetricId]
  listMetricIds = R.listMetricIds <$> RegistryT get
  
  
  sample :: Monad m => RegistryT m (IO RegistrySample)
  sample = R.sample <$> RegistryT get
  