packages feed

pandora-0.4.7: Pandora/Pattern/Morphism/Flip.hs

module Pandora.Pattern.Morphism.Flip where

import Pandora.Pattern.Semigroupoid (Semigroupoid ((.)))
import Pandora.Pattern.Category (Category (identity))
import Pandora.Pattern.Functor.Covariant (Covariant ((<$>)))
import Pandora.Pattern.Functor.Contravariant (Contravariant ((>$<)))
import Pandora.Core.Appliable (Appliable ((!)))

newtype Flip (v :: * -> * -> *) a e = Flip (v e a)

instance Semigroupoid m => Semigroupoid (Flip m) where
  Flip g . Flip f = Flip (f . g)

instance Category m => Category (Flip m) where
	identity = Flip identity

instance (Category m, Covariant m m t) => Contravariant (Flip m) m t where
	(>$<) (Flip f) = (<$>) f

instance (Category m, Covariant m m t) => Contravariant m (Flip m) t where
	(>$<) f = Flip ((<$>) f)

instance (Category m, Covariant m m t) => Covariant  (Flip m) (Flip m) t where
	(<$>) (Flip f) = Flip ((<$>) f)

instance Appliable (Flip m) b c m c b where
	(!) (Flip m) = m