{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module Control.Monad.Indexed.Free.Class (IxMonadFree(..), iliftFree) where
import Control.Monad.Indexed

class IxMonad m => IxMonadFree f m | m -> f where
    iwrap :: f i j (m j k a) -> m i k a

iliftFree :: (IxFunctor f, IxMonadFree f m) => f i j a -> m i j a
iliftFree = iwrap . imap ireturn