timer-wheel-0.4.0: src/TimerWheel/Internal/Timestamp.hs
module TimerWheel.Internal.Timestamp
( Timestamp (..),
epoch,
minus,
now,
plus,
TimerWheel.Internal.Timestamp.rem,
)
where
import Data.Coerce (coerce)
import Data.Word (Word64)
import GHC.Clock (getMonotonicTimeNSec)
import TimerWheel.Internal.Micros (Micros (..))
newtype Timestamp
= Timestamp Word64
deriving stock (Eq, Ord)
-- Which epoch does this correspond to, if they are measured in chunks of the given number of milliseconds?
epoch :: Micros -> Timestamp -> Word64
epoch (Micros chunk) (Timestamp timestamp) =
timestamp `div` chunk
minus :: Timestamp -> Timestamp -> Micros
minus =
coerce ((-) @Word64)
now :: IO Timestamp
now = do
nanos <- getMonotonicTimeNSec
pure (Timestamp (nanos `div` 1000))
plus :: Timestamp -> Micros -> Timestamp
plus =
coerce ((+) @Word64)
rem :: Timestamp -> Micros -> Micros
rem =
coerce (Prelude.rem @Word64)