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
runIdentityX :: (Index ix) => ix -> IdentityX ix a -> a
runIdentityX _ m = runIdentityX' m
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))