content: -- to be found MonadBaseControl
  -- this tests the utf-8 characters
  
  class MonadBase b m ⇒ MonadBaseControl b m | m → b where
      -- | Monadic state of @m@.
      data StM m ∷ * → *
  
      -- | @liftBaseWith@ is similar to 'liftIO' and 'liftBase' in that it
      -- lifts a base computation to the constructed monad.
      --
      -- Instances should satisfy similar laws as the 'MonadIO' and 'MonadBase' laws:
      --
      -- @liftBaseWith . const . return = return@
      --
      -- @liftBaseWith (const (m >>= f)) = liftBaseWith (const m) >>= liftBaseWith . const . f@
      --
      -- The difference with 'liftBase' is that before lifting the base computation
      -- @liftBaseWith@ captures the state of @m@. It then provides the base
      -- computation with a 'RunInBase' function that allows running @m@
      -- computations in the base monad on the captured state.
      liftBaseWith ∷ (RunInBase m b → b a) → m a
  
      -- | Construct a @m@ computation from the monadic state of @m@ that is
      -- returned from a 'RunInBase' function.
      --
      -- Instances should satisfy:
      --
      -- @liftBaseWith (\\runInBase -> runInBase m) >>= restoreM = m@
      restoreM ∷ StM m a → m a
  
  -- | A function that runs a @m@ computation on the monadic state that was
  -- captured by 'liftBaseWith'
  --
  -- A @RunInBase m@ function yields a computation in the base monad of @m@ that
  -- returns the monadic state of @m@. This state can later be used to restore the
  -- @m@ computation using 'restoreM'.
  type RunInBase m b = ∀ a. m a → b (StM m a)
  