{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE UndecidableInstances #-} module Network.Tox.Timed where import Control.Monad.Random (RandT) import Control.Monad.Reader (ReaderT) import Control.Monad.RWS (RWST) import Control.Monad.State (StateT) import Control.Monad.Trans (lift) import Control.Monad.Writer (WriterT) import Network.Tox.Time (Timestamp) class Monad m => Timed m where askTime :: m Timestamp instance Timed m => Timed (ReaderT r m) where askTime :: ReaderT r m Timestamp askTime = m Timestamp -> ReaderT r m Timestamp forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift m Timestamp forall (m :: * -> *). Timed m => m Timestamp askTime instance (Monoid w, Timed m) => Timed (WriterT w m) where askTime :: WriterT w m Timestamp askTime = m Timestamp -> WriterT w m Timestamp forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift m Timestamp forall (m :: * -> *). Timed m => m Timestamp askTime instance Timed m => Timed (StateT s m) where askTime :: StateT s m Timestamp askTime = m Timestamp -> StateT s m Timestamp forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift m Timestamp forall (m :: * -> *). Timed m => m Timestamp askTime instance (Monoid w, Timed m) => Timed (RWST r w s m) where askTime :: RWST r w s m Timestamp askTime = m Timestamp -> RWST r w s m Timestamp forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift m Timestamp forall (m :: * -> *). Timed m => m Timestamp askTime instance Timed m => Timed (RandT s m) where askTime :: RandT s m Timestamp askTime = m Timestamp -> RandT s m Timestamp forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift m Timestamp forall (m :: * -> *). Timed m => m Timestamp askTime