module Test.Hspec.Core.Clock (
Seconds(..)
, toMicroseconds
, getMonotonicTime
, measure
, sleep
) where
import Text.Printf
import System.Clock
import Control.Concurrent
newtype Seconds = Seconds Double
deriving (Eq, Show, Num, Fractional, PrintfArg)
toMicroseconds :: Seconds -> Int
toMicroseconds (Seconds s) = floor (s * 1000000)
getMonotonicTime :: IO Seconds
getMonotonicTime = do
t <- getTime Monotonic
return $ Seconds ((fromIntegral . toNanoSecs $ t) / 1000000000)
measure :: IO a -> IO (Seconds, a)
measure action = do
t0 <- getMonotonicTime
a <- action
t1 <- getMonotonicTime
return (t1 t0, a)
sleep :: Seconds -> IO ()
sleep = threadDelay . toMicroseconds