content: module System.Metrics.Prometheus.Encode.Text (
      encodeMetrics,
  ) where
  
  import Data.ByteString.Builder (Builder)
  import Data.Function (on)
  import Data.List (
      groupBy,
      intersperse,
   )
  import qualified Data.Map as Map
  import Data.Monoid ((<>))
  
  import System.Metrics.Prometheus.Encode.Text.Histogram (encodeHistogram)
  import System.Metrics.Prometheus.Encode.Text.MetricId (
      encodeDouble,
      encodeHeader,
      encodeInt,
      encodeMetricId,
      newline,
      space,
   )
  import System.Metrics.Prometheus.Metric (
      MetricSample (..),
      metricSample,
   )
  import System.Metrics.Prometheus.Metric.Counter (CounterSample (..))
  import System.Metrics.Prometheus.Metric.Gauge (GaugeSample (..))
  import System.Metrics.Prometheus.MetricId (MetricId (..))
  import System.Metrics.Prometheus.Registry (RegistrySample (..))
  
  
  encodeMetrics :: RegistrySample -> Builder
  encodeMetrics =
      (<> newline) . mconcat . intersperse newline . map encodeMetricGroup
          . groupByName
          . Map.toList
          . unRegistrySample
    where
      groupByName = groupBy ((==) `on` (name . fst))
  
  
  encodeMetricGroup :: [(MetricId, MetricSample)] -> Builder
  encodeMetricGroup group =
      encodeHeader mid sample <> newline
          <> mconcat (intersperse newline $ map encodeMetric group)
    where
      (mid, sample) = head group
  
  
  encodeMetric :: (MetricId, MetricSample) -> Builder
  encodeMetric (mid, sample) =
      metricSample
          (encodeCounter mid)
          (encodeGauge mid)
          (encodeHistogram mid)
          (encodeSummary mid)
          sample
    where
      encodeSummary = undefined
  
  
  encodeCounter :: MetricId -> CounterSample -> Builder
  encodeCounter mid counter = encodeMetricId mid <> space <> encodeInt (unCounterSample counter)
  
  
  encodeGauge :: MetricId -> GaugeSample -> Builder
  encodeGauge mid gauge = encodeMetricId mid <> space <> encodeDouble (unGaugeSample gauge)
  