module System.Remote.Counter
(
Counter
, inc
, dec
, add
, subtract
, set
) where
import Data.IORef (atomicModifyIORef)
import Prelude hiding (subtract)
import System.Remote.Counter.Internal
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, ())