content: {-# LANGUAGE BangPatterns #-}
  {-# LANGUAGE CPP #-}
  {-# HLINT ignore "Unused LANGUAGE pragma" #-}
  
  
  -- Test that threadDelay actually sleeps for (at least) as long as we
  -- ask it
  
  -- On windows the resolution of getCurrentTime is far too low to avoid
  -- false positives for this test. So we use the internal method from
  -- GHC.Event.Windows.Clock instead.
  
  module Main (main) where
  
  import Control.Concurrent
  import Control.Monad
  import Data.Time
  #if defined(mingw32_HOST_OS)
  import GHC.Event.Windows.Clock
  #endif
  
  main :: IO ()
  main = mapM_ delay (0 : take 7 (iterate (*5) 100))
  
  delay :: Int -> IO ()
  delay n = do
  #if defined(mingw32_HOST_OS)
    !sec_start <- getClock >>= getTime
    threadDelay n
    !sec_end <- getClock >>= getTime
  
    let diff = sec_end - sec_start
    when (diff * 1000000 < fromIntegral n) $ do
      putStrLn "threadDelay returned early"
      print(sec_start, sec_end, n, diff*1000000)
  
  #else
    tS <- getCurrentTime
    threadDelay n
    tE <- getCurrentTime
    let req = fromIntegral n * 10 ^ (6 :: Int)
        obs = floor (diffUTCTime tE tS * 10 ^ (12 :: Int))
        diff = obs - req
        diff' :: Double
        diff' = fromIntegral diff /  10 ^ (12 :: Int)
  
    when (obs < req) $ print (tS, tE, req, obs, diff, diff')
  #endif
  