{-# LANGUAGE TemplateHaskell #-}

module Wire.Sem.Metrics where

import Imports
import Polysemy
import Prometheus (Counter, Gauge)

-- | NOTE: Vectors would require non trival changes because
-- 'Prometheus.withLabel' take a paramter of type 'metric -> IO ()'.
data Metrics m a where
  AddCounter :: Counter -> Double -> Metrics m ()
  AddGauge :: Gauge -> Double -> Metrics m ()

makeSem ''Metrics

incCounter :: (Member Metrics r) => Counter -> Sem r ()
incCounter :: forall (r :: EffectRow). Member Metrics r => Counter -> Sem r ()
incCounter Counter
c = Counter -> Double -> Sem r ()
forall (r :: EffectRow).
Member Metrics r =>
Counter -> Double -> Sem r ()
addCounter Counter
c Double
1

incGauge :: (Member Metrics r) => Gauge -> Sem r ()
incGauge :: forall (r :: EffectRow). Member Metrics r => Gauge -> Sem r ()
incGauge Gauge
c = Gauge -> Double -> Sem r ()
forall (r :: EffectRow).
Member Metrics r =>
Gauge -> Double -> Sem r ()
addGauge Gauge
c Double
1