Typeclass for monads that can be unlifted to arbitrary base monads:
class (MonadBase b m) => MonadUnlift b m where withRunInBase :: ((forall a . m a -> b a) -> b x) -> m x
This typeclass is helpful when writing code that is polymorphic over the base monad, so later you can select a different base monad for each specific use-case.
Common usages include: