module Control.PFunctor (
PFunctor(..),
raiseP
) where
import Control.Proxy.Class (Proxy)
import Control.Proxy.Trans (ProxyTrans(liftP))
class PFunctor (
t :: (* -> * -> * -> * -> (* -> *) -> * -> *)
-> * -> * -> * -> * -> (* -> *) -> * -> * ) where
hoistP
:: (Monad m, Proxy p)
=> (forall a' a b' b r1 . p a' a b' b m r1 -> q a' a b' b m r1)
-> (t p a' a b' b m r2 -> t q a' a b' b m r2)
raiseP
:: (Monad m, Proxy p, PFunctor t1, ProxyTrans t2)
=> t1 p a' a b' b m r -> t1 (t2 p) a' a b' b m r
raiseP = hoistP liftP