module IdMT where import MT import Control_Monad_Fix import Monad(liftM) newtype With_ m a = I { removeId :: m a } instance MT With_ where lift = I instance Monad m => Monad (With_ m) where return = lift . return I m >>= f = I (m >>= removeId . f) instance Monad m => Functor (With_ m) where fmap = liftM instance HasBaseMonad m n => HasBaseMonad (With_ m) n where inBase = I . inBase instance HasEnv m ix e => HasEnv (With_ m) ix e where getEnv = I . getEnv instance HasState m ix e => HasState (With_ m) ix e where updSt ix = I . updSt ix instance HasOutput m ix o => HasOutput (With_ m) ix o where outputTree ix = I . outputTree ix instance HasExcept m x => HasExcept (With_ m) x where raise = I . raise handle h = I . handle (removeId . h) . removeId instance HasCont m => HasCont (With_ m) where callcc f = I (callcc f') where f' k = removeId (f (I . k)) instance HasRefs m r => HasRefs (With_ m) r where newRef = I . newRef readRef = I . readRef writeRef r = I . writeRef r instance MonadFix m => MonadFix (With_ m) where mfix f = I (mfix (removeId . f))