module Mensam.Server.Server.Handler.Profiler.Class where

import Control.Monad.Trans.Class
import Control.Monad.Trans.Compose
import Control.Monad.Trans.Elevator
import Data.Kind

type MonadProfiler :: (Type -> Type) -> Constraint
class Monad m => MonadProfiler m where
  profilerDuration :: m ()

instance
  ( Monad (t m)
  , MonadTrans t
  , MonadProfiler m
  ) =>
  MonadProfiler (Elevator t m)
  where
  profilerDuration :: Elevator t m ()
profilerDuration = m () -> Elevator t m ()
forall (m :: * -> *) a. Monad m => m a -> Elevator t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m ()
forall (m :: * -> *). MonadProfiler m => m ()
profilerDuration

deriving via
  Elevator t1 ((t2 :: (Type -> Type) -> Type -> Type) m)
  instance
  {-# OVERLAPPABLE #-}
    ( Monad (t1 (t2 m))
    , MonadTrans t1
    , MonadProfiler (t2 m)
    ) =>
    MonadProfiler (ComposeT t1 t2 m)