pandora-0.4.4: Pandora/Pattern/Functor/Divariant.hs
module Pandora.Pattern.Functor.Divariant where
import Pandora.Pattern.Functor.Covariant (Covariant_)
import Pandora.Pattern.Functor.Contravariant (Contravariant_)
import Pandora.Paradigm.Primary.Transformer.Flip (Flip)
infixl 4 >->
{- |
> When providing a new instance, you should ensure it satisfies:
> * Identity: identity >-> identity ≡ identity
> * Interpreted: f . g >-> h . i ≡ g >-> h . f >-> i
-}
--class (forall i . Covariant (v i)) => Divariant (v :: * -> * -> *) where
-- {-# MINIMAL (>->) #-}
-- (>->) :: (a -> b) -> (c -> d) -> v b c -> v a d
-- -- | Prefix version of '>->'
-- dimap :: (a -> b) -> (c -> d) -> v b c -> v a d
-- dimap f g x = (f >-> g) x
class (forall i . Contravariant_ (Flip v i) left target, forall i . Covariant_ (v i) right target)
=> Divariant v left right target where
(>->) :: left a b -> right c d -> target (v b c) (v a d)