{-# LANGUAGE KindSignatures
, RankNTypes
, TypeInType #-}
module Data.Expression.Utils.Indexed.Traversable where
import Control.Monad
import Data.Kind
import Data.Expression.Utils.Indexed.Functor
class ITraversable (t :: (i -> *) -> (i -> *)) where
itraverse :: forall (a :: i -> *) (b :: i -> *) f. Applicative f => (forall (i' :: i). a i' -> f (b i')) -> (forall (i' :: i). t a i' -> f (t b i'))
imapM :: ( ITraversable f, Monad m ) => (forall (i' :: i). IFix f i' -> m (IFix f i')) -> (forall (i' :: i). IFix f i' -> m (IFix f i'))
imapM f = f . IFix <=< itraverse (imapM f) . unIFix