Converting from transformers state to mtl


Suppose I have a transformer stack such as StateT s IO a and I need to use this with any transformer stack which wraps this one, so things such as ExceptT e (StateT s IO a), WriterT w (StateT s IO a), or ExceptT e (WriterT w (StateT s IO a). In this case lift wouldn’t do, as sometimes I would need lift and others lift.lift, etc. Would the following function be the right way to do this ?

transformersToMtlState :: (Monad m, MonadState s t, MonadBase m t) => StateT s m a -> t a
transformersToMtlState m = do
  currentState <- get
  (a, newState) <- liftBase $ runStateT m currentState
  put newState
  return a

Miguel Negrão