module Mensam.Server.Application.Options.Class where

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

type MonadOptions :: (Type -> Type) -> Constraint
class Monad m => MonadOptions m where
  options :: m Options

instance
  ( Monad (t m)
  , MonadTrans t
  , MonadOptions m
  ) =>
  MonadOptions (Elevator t m)
  where
  options :: Elevator t m Options
options = m Options -> Elevator t m Options
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 Options
forall (m :: * -> *). MonadOptions m => m Options
options

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

type Options :: Type
newtype Options = MkOptions
  { Options -> ()
optionUnit :: ()
  }