{-# 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