{-# LANGUAGE TypeApplications #-}
module Data.TimerWheel.Internal.Micros
( Micros (..),
fromFixed,
fromSeconds,
Data.TimerWheel.Internal.Micros.div,
minus,
scale,
sleep,
)
where
import Control.Concurrent (threadDelay)
import Data.Coerce
import Data.Fixed
import Data.Word
newtype Micros = Micros {unMicros :: Word64}
deriving stock (Eq, Ord)
fromFixed :: Fixed E6 -> Micros
fromFixed =
coerce @(Integer -> Word64) fromIntegral
fromSeconds :: Fixed E6 -> Micros
fromSeconds seconds@(MkFixed micros)
| micros < 0 = error ("[timer-wheel] invalid seconds: " ++ show seconds)
| otherwise = Micros (fromIntegral micros)
div :: Micros -> Micros -> Micros
div =
coerce (Prelude.div @Word64)
minus :: Micros -> Micros -> Micros
minus =
coerce ((-) @Word64)
scale :: Int -> Micros -> Micros
scale n (Micros w) =
Micros (fromIntegral n * w)
sleep :: Micros -> IO ()
sleep (Micros micros) =
threadDelay (fromIntegral micros)