packages feed

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