module Control.Monad.IdentityX (
IdentityX(..),
runIdentityX,
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
data (Index ix) => IdentityX ix a = IdentityX ix a
runIdentityX :: (Index ix) => ix -> IdentityX ix a -> a
runIdentityX (_::ix) (IdentityX (_::ix) a) = a
instance (Index ix) => Functor (IdentityX ix) where
fmap f m = IdentityX (getVal::ix) (f (runIdentityX (getVal::ix) m))
instance (Index ix) => Monad (IdentityX ix) where
return a = IdentityX (getVal::ix) a
m >>= k = k (runIdentityX (getVal::ix) m)
instance (Index ix) => MonadFix (IdentityX ix) where
mfix f = IdentityX (getVal::ix) (fix (runIdentityX (getVal::ix) . f))