ekg/System/Remote/Gauge.hs
2011-12-30 22:37:36 -08:00

55 lines
1.5 KiB
Haskell

{-# LANGUAGE BangPatterns #-}
-- | This module defines a type for mutable, integer-valued gauges.
-- Gauges are variable values and can be used to track e.g. the
-- current number of concurrent connections. All operations on gauges
-- are thread-safe.
module System.Remote.Gauge
(
Gauge
, inc
, dec
, add
, subtract
, set
, modify
) where
import Data.IORef (atomicModifyIORef)
import Prelude hiding (subtract)
import System.Remote.Gauge.Internal
-- | Increase the gauge by one.
inc :: Gauge -> IO ()
inc (C ref) = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n + 1 in (n', n')
return ()
-- | Decrease the gauge by one.
dec :: Gauge -> IO ()
dec (C ref) = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n - 1 in (n', n')
return ()
-- | Increase the gauge by the given amount.
add :: Gauge -> Int -> IO ()
add (C ref) i = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n + i in (n', n')
return ()
-- | Decrease the gauge by the given amount.
subtract :: Gauge -> Int -> IO ()
subtract (C ref) i = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n - i in (n', n')
return ()
-- | Set the gauge to the given value.
set :: Gauge -> Int -> IO ()
set (C ref) !i = atomicModifyIORef ref $ \ _ -> (i, ())
-- | Set the gauge to the result of applying the given function to the
-- value.
modify :: (Int -> Int) -> Gauge -> IO ()
modify f (C ref) = do
!_ <- atomicModifyIORef ref $ \ i -> let i' = f i in (i', i')
return ()