{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE DefaultSignatures #-}

-- Compare to indexed.Data.Functor.Indexed (IxFunctor)
module MHask.Indexed.Functor where

import MHask.Util

import Control.Monad.Trans.State
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Writer

import qualified MHask.Functor as MHask

class IxFunctor t where
  imap :: (Monad m, Monad n, Monad (t i j m), Monad (t i j n))
    => (m ~> n) -> (t i j m ~> t i j n)
  default imap :: (Monad m, Monad n, Monad (t i j m), Monad (t i j n),
                     MHask.Functor (t i j))
    => (m ~> n) -> (t i j m ~> t i j n)
  imap = MHask.fmap