    {-# LANGUAGE TypeOperators #-}
    {-# LANGUAGE MultiParamTypeClasses #-}
    {-# LANGUAGE FunctionalDependencies #-}
    {-# LANGUAGE RankNTypes #-}
    module Data.Profunctor.Adjunction where

    import Data.Profunctor
    import Data.Profunctor.Monad

    class (ProfunctorFunctor f, ProfunctorFunctor u) => ProfunctorAdjunction f u | f -> u, u -> f where
      unit   :: Profunctor p => p :-> u (f p)
      counit :: Profunctor p => f (u p) :-> p