module Network.Wai.Handler.Warp.Counter (
Counter
, newCounter
, isZero
, increase
, decrease
) where
import Network.Wai.Handler.Warp.IORef
import Control.Applicative ((<$>))
newtype Counter = Counter (IORef Int)
newCounter :: IO Counter
newCounter = Counter <$> newIORef 0
isZero :: Counter -> IO Bool
isZero (Counter ref) = (== 0) <$> readIORef ref
increase :: Counter -> IO ()
increase (Counter ref) = atomicModifyIORef' ref $ \x -> (x + 1, ())
decrease :: Counter -> IO ()
decrease (Counter ref) = atomicModifyIORef' ref $ \x -> (x 1, ())