-- | This module defines a type for mutable, integer-valued counters. -- Counters are non-negative, monotonically increasing values and can -- be used to track e.g. the number of requests served since program -- start. All operations on counters are thread-safe. module System.Metrics.Counter ( Counter , new , read , inc , add ) where import qualified Data.Atomic as Atomic import Data.Int (Int64) import Prelude hiding (read) -- | A mutable, integer-valued counter. newtype Counter = C { unC :: Atomic.Atomic } -- | Create a new, zero initialized, counter. new :: IO Counter new = C `fmap` Atomic.new 0 -- | Get the current value of the counter. read :: Counter -> IO Int64 read = Atomic.read . unC -- | Increase the counter by one. inc :: Counter -> IO () inc counter = add counter 1 -- | Add the argument to the counter. add :: Counter -> Int64 -> IO () add counter = Atomic.add (unC counter)