{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe                  #-}
{-# LANGUAGE UndecidableInstances  #-}

module Network.Tox.Timed where

import           Control.Monad        (Monad)
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           Data.Monoid          (Monoid)

import           Network.Tox.Time     (Timestamp)

class Monad m => Timed m where
  askTime :: m Timestamp

instance Timed m => Timed (ReaderT r m) where
  askTime = lift askTime
instance (Monoid w, Timed m) => Timed (WriterT w m) where
  askTime = lift askTime
instance Timed m => Timed (StateT s m) where
  askTime = lift askTime
instance (Monoid w, Timed m) => Timed (RWST r w s m) where
  askTime = lift askTime
instance Timed m => Timed (RandT s m) where
  askTime = lift askTime