module Debug.TimeStats.Unsafe
(
unsafeMeasureM
) where
import Debug.TimeStats
( TimeStats(..)
, TimeStatsRef
, enabled
, lookupTimeStatsRef
, updateTimeStatsRef
)
import GHC.Clock (getMonotonicTimeNSec)
import System.IO.Unsafe (unsafePerformIO)
{-# INLINE unsafeMeasureM #-}
unsafeMeasureM :: Monad m => String -> m a -> m a
unsafeMeasureM :: forall (m :: * -> *) a. Monad m => String -> m a -> m a
unsafeMeasureM String
label =
if Bool
enabled then do
let ref :: TimeStatsRef
ref = IO TimeStatsRef -> TimeStatsRef
forall a. IO a -> a
unsafePerformIO (IO TimeStatsRef -> TimeStatsRef)
-> IO TimeStatsRef -> TimeStatsRef
forall a b. (a -> b) -> a -> b
$ String -> IO TimeStatsRef
lookupTimeStatsRef String
label
in \m a
action -> TimeStatsRef -> m a -> m a
forall (m :: * -> *) a. Monad m => TimeStatsRef -> m a -> m a
measureMWith TimeStatsRef
ref m a
action
else
m a -> m a
forall a. a -> a
id
measureMWith :: Monad m => TimeStatsRef -> m a -> m a
measureMWith :: forall (m :: * -> *) a. Monad m => TimeStatsRef -> m a -> m a
measureMWith TimeStatsRef
tref m a
m = do
Word64
t0 <- IO Word64 -> m Word64
forall (m :: * -> *) a. Monad m => IO a -> m a
intersperseIOinM IO Word64
getMonotonicTimeNSec
a
a <- m a
m
IO () -> m ()
forall (m :: * -> *) a. Monad m => IO a -> m a
intersperseIOinM (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Word64
tf <- IO Word64
getMonotonicTimeNSec
TimeStatsRef -> (TimeStats -> TimeStats) -> IO ()
updateTimeStatsRef TimeStatsRef
tref ((TimeStats -> TimeStats) -> IO ())
-> (TimeStats -> TimeStats) -> IO ()
forall a b. (a -> b) -> a -> b
$ \TimeStats
st ->
TimeStats
st
{ timeStat = (tf - t0) + timeStat st
, countStat = 1 + countStat st
}
a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
intersperseIOinM :: Monad m => IO a -> m a
intersperseIOinM :: forall (m :: * -> *) a. Monad m => IO a -> m a
intersperseIOinM IO a
m = do
Bool
s <- m Bool
getStateM
case IO (Bool, a) -> (Bool, a)
forall a. IO a -> a
unsafePerformIO (IO (Bool, a) -> (Bool, a)) -> IO (Bool, a) -> (Bool, a)
forall a b. (a -> b) -> a -> b
$ (,) Bool
s (a -> (Bool, a)) -> IO a -> IO (Bool, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO a
m of
(Bool
_, a
r) -> a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
r
where
{-# NOINLINE getStateM #-}
getStateM :: m Bool
getStateM = Bool -> m Bool
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True