naperian-0.1.0.0: src/Data/Functor1.hs
{-# 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