instrument-0.6.0.0: src/Instrument/ClientClass.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : Instrument.ClientClass
-- Copyright : Soostone Inc
-- License : BSD3
--
-- Maintainer : Ozgun Ataman
-- Stability : experimental
--
-- This module mimics the functionality of Instrument.Client but
-- instead exposes a typeclass facilitated interface. Once you define
-- the typeclass for your application's main monad, you can call all
-- the mesaurement functions directly.
----------------------------------------------------------------------------
module Instrument.ClientClass
( I.Instrument
, I.initInstrument
, HasInstrument (..)
, sampleI
, timeI
, countI
, incrementI
) where
-------------------------------------------------------------------------------
import Control.Monad.IO.Class
import Control.Monad.Reader
-------------------------------------------------------------------------------
import qualified Instrument.Client as I
import Instrument.Types
-------------------------------------------------------------------------------
class HasInstrument m where
getInstrument :: m I.Instrument
instance (Monad m) => HasInstrument (ReaderT I.Instrument m) where
getInstrument = ask
-- | Run a monadic action while measuring its runtime
timeI :: (MonadIO m, HasInstrument m)
=> MetricName
-> HostDimensionPolicy
-> Dimensions
-> m a
-> m a
timeI name hostDimPolicy dims act = do
i <- getInstrument
I.timeI name hostDimPolicy dims i act
-- | Record a measurement sample
sampleI :: (MonadIO m, HasInstrument m )
=> MetricName
-> HostDimensionPolicy
-> Dimensions
-> Double
-> m ()
sampleI name hostDimPolicy dims val =
I.sampleI name hostDimPolicy dims val =<< getInstrument
-------------------------------------------------------------------------------
incrementI
:: ( MonadIO m
, HasInstrument m
)
=> MetricName
-> HostDimensionPolicy
-> Dimensions
-> m ()
incrementI m hostDimPolicy dims =
I.incrementI m hostDimPolicy dims =<< getInstrument
-------------------------------------------------------------------------------
countI
:: ( MonadIO m
, HasInstrument m
)
=> MetricName
-> HostDimensionPolicy
-> Dimensions
-> Int
-> m ()
countI m hostDimPolicy dims v =
I.countI m hostDimPolicy dims v =<< getInstrument