module Control.Concurrent.Delay
(
-- * Delay
  Delay(Delay)

, usDelay
, msDelay
, sDelay
, mDelay
, hDelay
, (.+.)
) where

------------------------------------------------------------------------------
import           Data.Int (Int64)
------------------------------------------------------------------------------

------------------------------------------------------------------------------
-- | DELAY
--
-- TODO:
-- * Add overflow checks.

-- | Type representing delay in microseconds.
newtype Delay = Delay Int64

-- | Sums two delays.
(.+.) :: Delay -> Delay -> Delay
(Delay x) .+. (Delay y) = Delay $ x + y
{-# INLINE (.+.) #-}

infixl 6 .+.

-- | Delay in microseconds.
usDelay :: Int64 -> Delay
usDelay = Delay
{-# INLINE usDelay #-}

-- | Delay in milliseconds.
msDelay :: Int64 -> Delay
msDelay = Delay . (1000 *)
{-# INLINE msDelay #-}

-- | Delay in seconds.
sDelay :: Int64 -> Delay
sDelay = Delay . (1000 * 1000 *)
{-# INLINE sDelay #-}

-- | Delay in minutes.
mDelay :: Int64 -> Delay
mDelay = Delay . (1000 * 1000 * 60 *)
{-# INLINE mDelay #-}

-- | Delay in hours.
hDelay :: Int64 -> Delay
hDelay = Delay . (1000 * 1000 * 60 * 24 *)
{-# INLINE hDelay #-}