packages feed

instrument-0.6.0.0: src/Instrument/Measurement.hs

{-# LANGUAGE BangPatterns        #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators       #-}

-- |
-- Module      : Instrument.Measurement
-- Copyright   : (c) 2009, 2010 Bryan O'Sullivan
--               (c) 2012, Ozgun Ataman
--
-- License     : BSD-style

module Instrument.Measurement
    (
      getTime
    , time
    , time_
    , timeEx
    ) where

-------------------------------------------------------------------------------
import           Control.Monad.IO.Class
import           Data.Time.Clock.POSIX  (getPOSIXTime)
import           Control.Exception (SomeException)
import           Control.Exception.Safe (MonadCatch, tryAny)
-------------------------------------------------------------------------------


-- | Measure how long action took, in seconds along with its result
time :: MonadIO m =>  m a -> m (Double, a)
time act = do
  start <- liftIO getTime
  !result <- act
  end <- liftIO getTime
  let !delta = end - start
  return (delta, result)

-- | Measure how long action took, even if they fail
timeEx :: (MonadCatch m, MonadIO m) => m a -> m (Double, Either SomeException a)
timeEx = time . tryAny

-- | Just measure how long action takes, discard its result
time_ :: MonadIO m => m a -> m Double
time_  = fmap fst . time


-------------------------------------------------------------------------------
getTime :: IO Double
getTime = realToFrac `fmap` getPOSIXTime