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