module Data.Metrics.Counter (
Counter,
counter,
increment,
increment',
decrement,
decrement',
module Data.Metrics.Types
) where
import Control.Monad.Base
import Control.Monad.Primitive
import qualified Data.HashMap.Strict as H
import Data.Metrics.Internal
import Data.Metrics.Types
import Data.Primitive.MutVar
newtype Counter m = Counter { fromCounter :: MV m Int }
instance (MonadBase b m, PrimMonad b) => Count b m (Counter b) where
count (Counter ref) = liftBase $ readMutVar ref
instance (MonadBase b m, PrimMonad b) => Value b m (Counter b) Int where
value (Counter ref) = liftBase $ readMutVar ref
instance (MonadBase b m, PrimMonad b) => Set b m (Counter b) Int where
set (Counter ref) x = liftBase $ updateRef ref (const x)
instance (MonadBase b m, PrimMonad b) => Clear b m (Counter b) where
clear c = set c 0
counter :: (MonadBase b m, PrimMonad b) => m (Counter b)
counter = liftBase $ fmap Counter $ newMutVar 0
increment :: PrimMonad m => Counter m -> m ()
increment = flip increment' 1
increment' :: PrimMonad m => Counter m -> Int -> m ()
increment' (Counter ref) x = updateRef ref (+ x)
decrement :: PrimMonad m => Counter m -> m ()
decrement = flip decrement' 1
decrement' :: PrimMonad m => Counter m -> Int -> m ()
decrement' (Counter ref) x = updateRef ref (subtract x)