41 lines
874 B
Haskell
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, ())
|