-- Copyright 2024 Shea Levy
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UnicodeSyntax #-}

{- |
Description : 'MonadTrans'formers that preserve t'ParametricFunctor'
Copyright   : Copyright 2024 Shea Levy.
License     : Apache-2.0
Maintainer  : shea@shealevy.com
-}
module Control.Monad.Trans.Class.Parametric where

import Control.Monad.Trans.Class
import Data.Coerce
import Data.Functor.Parametric

-- | 'MonadTrans'formers that preserve t'ParametricFunctor'
class
  ( MonadTrans t
  ,  m x y
     . ( Monad m
       , ParametricFunctor m
       , Coercible x y
       )
     Coercible (t m x) (t m y)
  ) 
  ParametricMonadTrans t

instance
  ( MonadTrans t
  ,  m x y
     . ( Monad m
       , ParametricFunctor m
       , Coercible x y
       )
     Coercible (t m x) (t m y)
  )
   ParametricMonadTrans t