module Mensam.Client.Application.HttpClient.Class where

import Control.Monad.Trans
import Control.Monad.Trans.Compose
import Control.Monad.Trans.Elevator
import Data.Kind
import Network.HTTP.Client qualified as Network

type MonadHttpClient :: (Type -> Type) -> Constraint
class Monad m => MonadHttpClient m where
  httpManager :: m Network.Manager

instance
  ( Monad (t m)
  , MonadTrans t
  , MonadHttpClient m
  ) =>
  MonadHttpClient (Elevator t m)
  where
  httpManager :: Elevator t m Manager
httpManager = m Manager -> Elevator t m Manager
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 Manager
forall (m :: * -> *). MonadHttpClient m => m Manager
httpManager

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