module Control.Clock.System (
newClock
, picosecondsToDiffTime
, newClockAt
, convClock
) where
import Data.Time.Clock
import qualified System.Time.Monotonic as T
import Control.Clock
diffTimeOp :: (Real a, Real b) => (Rational -> Rational -> Rational) -> a -> b -> DiffTime
diffTimeOp op a b = picosecondsToDiffTime $ floor $ 1000000000000 * (toRational a `op` toRational b)
newClock :: IO (Clock IO)
newClock = convClock (picosecondsToDiffTime 1000000000) <$> T.newClock
newClockAt :: DiffTime -> IO (Clock IO)
newClockAt intv = convClock intv <$> T.newClock
convClock :: DiffTime -> T.Clock -> Clock IO
convClock rate c = let r = checkPos rate in Clock {
clockNow = let div' = tickOp (/) in
(`div'` rate) <$> T.clockGetTime c
, clockDelay = let mul' = diffTimeOp (*) in
T.delay . (`mul'` r) . checkNonNeg
}