content: {-# LANGUAGE DeriveDataTypeable         #-}
  {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  
  module Snap.Internal.Http.Server.Clock
    ( ClockTime
    , getClockTime
    , sleepFor
    , sleepSecs
    , fromSecs
    , toSecs
    ) where
  
  import           Control.Concurrent (threadDelay)
  import qualified System.Clock       as Clock
  
  type ClockTime = Clock.TimeSpec
  
  ------------------------------------------------------------------------------
  sleepFor :: ClockTime -> IO ()
  sleepFor t = threadDelay $ fromIntegral d
    where
      d  = (Clock.nsec t `div` 1000) + (1000000 * Clock.sec t)
  
  
  ------------------------------------------------------------------------------
  sleepSecs :: Double -> IO ()
  sleepSecs = sleepFor . fromSecs
  
  
  ------------------------------------------------------------------------------
  getClockTime :: IO ClockTime
  getClockTime = Clock.getTime Clock.Monotonic
  
  
  ------------------------------------------------------------------------------
  fromSecs :: Double -> ClockTime
  fromSecs d = let (s, r) = properFraction d
               in Clock.TimeSpec s (truncate $! 1000000000 * r)
  
  
  ------------------------------------------------------------------------------
  toSecs :: ClockTime -> Double
  toSecs t = fromIntegral (Clock.sec t) +
             fromIntegral (Clock.nsec t) / 1000000000.0
  