packages feed

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