module Control.Monad.IdentityX (
IdentityX(..),
runIdentityX,
mkIdentityX,
module Control.Monad,
module Control.Monad.Fix,
module Control.Monad.Index
) where
import Control.Monad
import Control.Monad.Fix
import Control.Monad.Index
import Control.Monad.Identity()
newtype IdentityX ix a = IdentityX { runIdentityX :: a }
mkIdentityX:: (Index ix) => ix -> a -> IdentityX ix a
mkIdentityX _ a = IdentityX a
instance (Index ix) => Functor (IdentityX ix) where
fmap f m = mkIdentityX (getVal::ix) (f (runIdentityX m))
instance (Index ix) => Monad (IdentityX ix) where
return a = mkIdentityX (getVal::ix) a
m >>= k = k (runIdentityX m)
instance (Index ix) => MonadFix (IdentityX ix) where
mfix f = mkIdentityX (getVal::ix) (fix (runIdentityX . f))