packages feed

ribosome-0.4.0.0: lib/Ribosome/System/Time.hs

module Ribosome.System.Time where

import Control.Concurrent (threadDelay)
import Data.Hourglass (Elapsed(Elapsed), ElapsedP(ElapsedP), NanoSeconds(NanoSeconds), Seconds(Seconds))
import Data.Time.Clock.POSIX (getPOSIXTime)
import GHC.Float (word2Double)

epochSeconds :: MonadIO m => m Int
epochSeconds = liftIO $ round <$> getPOSIXTime

usleep :: MonadIO m => Double -> m ()
usleep =
  liftIO . threadDelay . round

sleep :: MonadIO m => Double -> m ()
sleep seconds =
  usleep $ seconds * 1e6

sleepW :: MonadIO m => Word -> m ()
sleepW = sleep . word2Double

secondsP :: Double -> ElapsedP
secondsP s =
  ElapsedP (Elapsed (Seconds $ floor s)) (NanoSeconds nano)
  where
    nano =
      round (s * 1000000000) `mod` 1000000000