prometheus-2.0.1: src/System/Metrics/Prometheus/Metric/Counter.hs
module System.Metrics.Prometheus.Metric.Counter
( Counter
, CounterSample (..)
, new
, add
, inc
, sample
, addAndSample
) where
import Control.Applicative ((<$>))
import Data.Atomics.Counter (AtomicCounter, incrCounter, newCounter)
newtype Counter = Counter { unCounter :: AtomicCounter }
newtype CounterSample = CounterSample { unCounterSample :: Int }
new :: IO Counter
new = Counter <$> newCounter 0
addAndSample :: Int -> Counter -> IO CounterSample
addAndSample by | by >= 0 = fmap CounterSample . incrCounter by . unCounter
| otherwise = error "must be >= 0"
add :: Int -> Counter -> IO ()
add by c = addAndSample by c >> pure ()
inc :: Counter -> IO ()
inc = add 1
sample :: Counter -> IO CounterSample
sample = addAndSample 0