    {-# LANGUAGE NoImplicitPrelude #-}
    {-# OPTIONS_HADDOCK hide #-}

    -----------------------------------------------------------------------------
    -- |
    -- Module      :  GHC.GHCi
    -- Copyright   :  (c) The University of Glasgow 2012
    -- License     :  see libraries/base/LICENSE
    --
    -- Maintainer  :  cvs-ghc@haskell.org
    -- Stability   :  internal
    -- Portability :  non-portable (GHC Extensions)
    --
    -- The GHCi Monad lifting interface.
    --
    -- EXPERIMENTAL! DON'T USE.
    --
    -----------------------------------------------------------------------------

    module GHC.GHCi {-# WARNING "This is an unstable interface." #-} (
            GHCiSandboxIO(..), NoIO()
        ) where

    import GHC.Base (IO(), Monad, Functor(fmap), Applicative(..), (>>=), return, id, (.), ap)

    -- | A monad that can execute GHCi statements by lifting them out of
    -- m into the IO monad. (e.g state monads)
    class (Monad m) => GHCiSandboxIO m where
        ghciStepIO :: m a -> IO a

    instance GHCiSandboxIO IO where
        ghciStepIO = id

    -- | A monad that doesn't allow any IO.
    newtype NoIO a = NoIO { noio :: IO a }

    instance Functor NoIO where
      fmap f (NoIO a) = NoIO (fmap f a)

    instance Applicative NoIO where
      pure  = return
      (<*>) = ap

    instance Monad NoIO where
        return a  = NoIO (return a)
        (>>=) k f = NoIO (noio k >>= noio . f)

    instance GHCiSandboxIO NoIO where
        ghciStepIO = noio