packages feed

prometheus-0.1.0.0: src/System/Metrics/Prometheus/Gauge.hs

module System.Metrics.Prometheus.Gauge where

import           Data.IORef (IORef, atomicModifyIORef', atomicWriteIORef,
                             newIORef, readIORef)


newtype Gauge = Gauge { unGauge :: IORef Double }


new :: IO Gauge
new = Gauge <$> newIORef 0

add :: Double -> Gauge -> IO ()
add x = flip atomicModifyIORef' f . unGauge
  where f v = (v + x, ())


sub :: Double -> Gauge -> IO ()
sub x = flip atomicModifyIORef' f . unGauge
  where f v = (v - x, ())

inc :: Gauge -> IO ()
inc = add 1


dec :: Gauge -> IO ()
dec = sub 1


set :: Double -> Gauge -> IO ()
set x = flip atomicWriteIORef x . unGauge


get :: Gauge -> IO Double
get = readIORef . unGauge