{-# LANGUAGE DeriveGeneric #-}
module Control.Monad.Class.MonadTime
( MonadTime (..)
, MonadMonotonicTimeNSec (..)
, UTCTime
, diffUTCTime
, addUTCTime
, NominalDiffTime
) where
import Control.Monad.Reader
import Data.Time.Clock (NominalDiffTime, UTCTime,
addUTCTime, diffUTCTime)
import qualified Data.Time.Clock as Time
import Data.Word (Word64)
import qualified GHC.Clock as IO (getMonotonicTimeNSec)
class Monad m => MonadMonotonicTimeNSec m where
getMonotonicTimeNSec :: m Word64
class Monad m => MonadTime m where
getCurrentTime :: m UTCTime
instance MonadMonotonicTimeNSec IO where
getMonotonicTimeNSec :: IO Word64
getMonotonicTimeNSec = IO Word64
IO.getMonotonicTimeNSec
instance MonadTime IO where
getCurrentTime :: IO UTCTime
getCurrentTime = IO UTCTime
Time.getCurrentTime
instance MonadMonotonicTimeNSec m => MonadMonotonicTimeNSec (ReaderT r m) where
getMonotonicTimeNSec :: ReaderT r m Word64
getMonotonicTimeNSec = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall (m :: * -> *). MonadMonotonicTimeNSec m => m Word64
getMonotonicTimeNSec
instance MonadTime m => MonadTime (ReaderT r m) where
getCurrentTime :: ReaderT r m UTCTime
getCurrentTime = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall (m :: * -> *). MonadTime m => m UTCTime
getCurrentTime