{-# LANGUAGE CPP #-} {-# LANGUAGE RankNTypes #-} module Data.Functor1 where import Control.Applicative (Const (..)) import Data.Proxy import Data.Type.Coercion -- | Objects in the category @(Hask -> Hask) -> Hask@ class Functor1 w where -- | @ -- map1 f . map1 g = map1 (f . g) -- map1 id = id -- @ map1 :: (forall a. f a -> g a) -> w f -> w g -- | mapCoerce1 c = map1 (coerceWith c) mapCoerce1 :: (forall x. Coercion (f x) (g x)) -> w f -> w g mapCoerce1 f = map1 (coerceWith f) instance Functor1 Proxy where map1 _ Proxy = Proxy #if MIN_VERSION_base(4,9,0) -- | since base-4.9 instance Functor1 (Const a) where map1 _ = Const . getConst #endif