module Pandora.Pattern.Functor.Divisible where import Pandora.Pattern.Functor.Contravariant (Contravariant) import Pandora.Pattern.Functor.Bivariant (Bivariant) import Pandora.Paradigm.Primary.Functor.Product (type (:*:)) infixr 5 >*< class Contravariant t => Divisible t where {-# MINIMAL (>*<) #-} (>*<) :: t b -> t c -> t (b :*: c) class Bivariant v => Divisible_ t v source target where divide :: Bivariant v => source r (v a b) -> target (v (t a) (t b)) (t r)