module Wire.Sem.Metrics.IO where

import Imports
import Polysemy
import qualified Prometheus as Prom
import Wire.Sem.Metrics

runMetricsToIO :: (Member (Embed IO) r) => InterpreterFor Metrics r
runMetricsToIO :: forall (r :: EffectRow).
Member (Embed IO) r =>
InterpreterFor Metrics r
runMetricsToIO = (forall (rInitial :: EffectRow) x.
 Metrics (Sem rInitial) x -> Sem r x)
-> Sem (Metrics : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall (rInitial :: EffectRow) x.
  Metrics (Sem rInitial) x -> Sem r x)
 -> Sem (Metrics : r) a -> Sem r a)
-> (forall (rInitial :: EffectRow) x.
    Metrics (Sem rInitial) x -> Sem r x)
-> Sem (Metrics : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
  AddCounter Counter
c Double
n -> IO x -> Sem r x
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO x -> Sem r x) -> (IO Bool -> IO x) -> IO Bool -> Sem r x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO Bool -> IO x
IO Bool -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO Bool -> Sem r x) -> IO Bool -> Sem r x
forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). MonadMonitor m => Counter -> Double -> m Bool
Prom.addCounter @IO Counter
c Double
n
  AddGauge Gauge
g Double
n -> IO () -> Sem r ()
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). MonadMonitor m => Gauge -> Double -> m ()
Prom.addGauge @IO Gauge
g Double
n

ignoreMetrics :: InterpreterFor Metrics r
ignoreMetrics :: forall (r :: EffectRow) a. Sem (Metrics : r) a -> Sem r a
ignoreMetrics = (forall (rInitial :: EffectRow) x.
 Metrics (Sem rInitial) x -> Sem r x)
-> Sem (Metrics : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret ((forall (rInitial :: EffectRow) x.
  Metrics (Sem rInitial) x -> Sem r x)
 -> Sem (Metrics : r) a -> Sem r a)
-> (forall (rInitial :: EffectRow) x.
    Metrics (Sem rInitial) x -> Sem r x)
-> Sem (Metrics : r) a
-> Sem r a
forall a b. (a -> b) -> a -> b
$ \case
  AddCounter Counter
_ Double
_ -> x -> Sem r x
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
  AddGauge Gauge
_ Double
_ -> x -> Sem r x
forall a. a -> Sem r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()