instrument-0.6.1.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