module Data.Profunctor.Product.Class where

import Data.Profunctor (Profunctor)

-- | A 'ProductProfunctor' is a generalization of an 'Applicative'.
-- It has an "input", contravariant type parameter on the left as well
-- as the usual 'Applicative' "output", covariant parameter on teh
-- right.
class Profunctor p => ProductProfunctor p where
  empty :: p () ()
  (***!) :: p a b -> p a' b' -> p (a, a') (b, b')