{-# LANGUAGE CPP, FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
#if __GLASGOW_HASKELL__ < 710
{-# LANGUAGE OverlappingInstances #-}
#endif
module Control.Monad.Time (MonadTime(..)) where
import Control.Monad.Trans
import Control.Monad.Reader (ReaderT, ask)
import Data.Time
class Monad m => MonadTime m where
currentTime :: m UTCTime
instance MonadTime IO where
currentTime :: IO UTCTime
currentTime = IO UTCTime
getCurrentTime
instance {-# OVERLAPPING #-} Monad m => MonadTime (ReaderT UTCTime m) where
currentTime :: ReaderT UTCTime m UTCTime
currentTime = ReaderT UTCTime m UTCTime
forall r (m :: * -> *). MonadReader r m => m r
ask
instance {-# OVERLAPPABLE #-} (
MonadTime m
, MonadTrans t
, Monad (t m)
) => MonadTime (t m) where
currentTime :: t m UTCTime
currentTime = m UTCTime -> t m UTCTime
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m UTCTime
forall (m :: * -> *). MonadTime m => m UTCTime
currentTime