module Mensam.Server.Application.Configured.Class where

import Mensam.Server.Configuration

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

type MonadConfigured :: (Type -> Type) -> Constraint
class Monad m => MonadConfigured m where
  configuration :: m Configuration

instance
  ( Monad (t m)
  , MonadTrans t
  , MonadConfigured m
  ) =>
  MonadConfigured (Elevator t m)
  where
  configuration :: Elevator t m Configuration
configuration = m Configuration -> Elevator t m Configuration
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 Configuration
forall (m :: * -> *). MonadConfigured m => m Configuration
configuration

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