module HGamer3D.Data.GameTime
(
GameTime,
sec,
msec,
usec,
secT,
msecT,
usecT,
getTime,
getThreadCPUTime,
getProcessCPUTime,
sleepFor
)
where
import Control.Concurrent
import qualified System.Clock as C
type GameTime = C.TimeSpec
_toInteger :: C.TimeSpec -> Integer
_toInteger ts = let
s = (fromIntegral (C.sec ts)) :: Integer
ns = (fromIntegral (C.nsec ts)) :: Integer
in s * 1000000000 + ns
_fromInteger :: Integer -> C.TimeSpec
_fromInteger i = let
s = fromIntegral (i `quot` 1000000000)
ns = fromIntegral (i `rem` 1000000000)
in C.TimeSpec s ns
sec :: C.TimeSpec -> Int
sec ts = fromIntegral ((_toInteger ts) `quot` 1000000000)
msec :: C.TimeSpec -> Int
msec ts = fromIntegral ((_toInteger ts) `quot` 1000000)
usec :: C.TimeSpec -> Int
usec ts = fromIntegral ((_toInteger ts) `quot` 1000)
secT :: Int -> C.TimeSpec
secT i = _fromInteger ((fromIntegral i) * 1000000000)
msecT :: Int -> C.TimeSpec
msecT i = _fromInteger ((fromIntegral i) * 1000000)
usecT :: Int -> C.TimeSpec
usecT i = _fromInteger ((fromIntegral i) * 1000)
getTime :: IO GameTime
getTime = C.getTime C.Realtime
getThreadCPUTime :: IO GameTime
getThreadCPUTime = C.getTime C.ThreadCPUTime
getProcessCPUTime :: IO GameTime
getProcessCPUTime = C.getTime C.ProcessCPUTime
sleepFor :: GameTime -> IO ()
sleepFor gt = threadDelay (usec gt)