{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall -Wno-name-shadowing #-}
module Data.IFunctor
( IFunctor (..)
-- * Re-exports
, module Data.IFunction
) where
import Data.Functor.Product (Product (Pair))
import Data.Functor.Sum (Sum (InL, InR))
import Data.IFunction (type (~~>))
-- | Functor in the category of dependent types
class IFunctor f where
imap :: (a ~~> b) -> (f a ~~> f b)
instance IFunctor (Sum a) where
imap _ (InL x) = InL x
imap f (InR x) = InR (f x)
instance IFunctor (Product a) where
imap f (Pair a b) = Pair a (f b)