ekg/System/Remote/Counter.hs
2011-12-29 13:15:42 -08:00

41 lines
874 B
Haskell

{-# LANGUAGE BangPatterns #-}
module System.Remote.Counter
(
new
, inc
, dec
, add
, subtract
, set
) where
import Data.IORef
import Prelude hiding (subtract)
newtype Counter = C (IORef Int)
new :: IO Counter
new = undefined
inc :: Counter -> IO ()
inc (C ref) = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n + 1 in (n', n')
return ()
dec :: Counter -> IO ()
dec (C ref) = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n - 1 in (n', n')
return ()
add :: Counter -> Int -> IO ()
add (C ref) i = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n + i in (n', n')
return ()
subtract :: Counter -> Int -> IO ()
subtract (C ref) i = do
!_ <- atomicModifyIORef ref $ \ n -> let n' = n - i in (n', n')
return ()
set :: Counter -> Int -> IO ()
set (C ref) !i = atomicModifyIORef ref $ \ _ -> (i, ())