{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances     #-}
-- {-# LANGUAGE RankNTypes           #-}
-- {-# LANGUAGE TypeSynonymInstances #-}
-- Functors parameterised over the morphisms in the source category
module Control.GFunctor where

infixl 8 <$$>

-- class ContravariantFunctor f where
--   cmap :: (b -> a) -> f a -> f b
-- 

class GFunctor f m where
  gmap :: m a b -> f a -> f b
 
instance (Functor a) => GFunctor a (->) where
  gmap = fmap

(<$$>) :: GFunctor f m =>m a b -> f a -> f b
(<$$>) = gmap

-- class GFunctor f m => GApplicative f m where
--   gpure :: a -> f a
--   (<**>) :: f (m a b) -> f a -> f b