{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Instrument.Measurement
( getTime,
time,
time_,
timeEx,
)
where
import Control.Exception (SomeException)
import Control.Exception.Safe (MonadCatch, tryAny)
import Control.Monad.IO.Class
import Data.Time.Clock.POSIX (getPOSIXTime)
time :: MonadIO m => m a -> m (Double, a)
time :: forall (m :: * -> *) a. MonadIO m => m a -> m (Double, a)
time m a
act = do
Double
start <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO Double
getTime
!a
result <- m a
act
Double
end <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO Double
getTime
let !delta :: Double
delta = Double
end forall a. Num a => a -> a -> a
- Double
start
forall (m :: * -> *) a. Monad m => a -> m a
return (Double
delta, a
result)
timeEx :: (MonadCatch m, MonadIO m) => m a -> m (Double, Either SomeException a)
timeEx :: forall (m :: * -> *) a.
(MonadCatch m, MonadIO m) =>
m a -> m (Double, Either SomeException a)
timeEx = forall (m :: * -> *) a. MonadIO m => m a -> m (Double, a)
time forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a.
MonadCatch m =>
m a -> m (Either SomeException a)
tryAny
time_ :: MonadIO m => m a -> m Double
time_ :: forall (m :: * -> *) a. MonadIO m => m a -> m Double
time_ = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. MonadIO m => m a -> m (Double, a)
time
getTime :: IO Double
getTime :: IO Double
getTime = forall a b. (Real a, Fractional b) => a -> b
realToFrac forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` IO POSIXTime
getPOSIXTime