{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_HADDOCK not-home #-}

-----------------------------------------------------------------------------
-- |
-- 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(..), (>>=), 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

-- | @since 4.4.0.0
instance GHCiSandboxIO IO where
    ghciStepIO :: forall a. IO a -> IO a
ghciStepIO = IO a -> IO a
forall a. a -> a
id

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

-- | @since 4.8.0.0
instance Functor NoIO where
  fmap :: forall a b. (a -> b) -> NoIO a -> NoIO b
fmap a -> b
f (NoIO IO a
a) = IO b -> NoIO b
forall a. IO a -> NoIO a
NoIO ((a -> b) -> IO a -> IO b
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f IO a
a)

-- | @since 4.8.0.0
instance Applicative NoIO where
  pure :: forall a. a -> NoIO a
pure a
a = IO a -> NoIO a
forall a. IO a -> NoIO a
NoIO (a -> IO a
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a)
  <*> :: forall a b. NoIO (a -> b) -> NoIO a -> NoIO b
(<*>) = NoIO (a -> b) -> NoIO a -> NoIO b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap

-- | @since 4.4.0.0
instance Monad NoIO where
    >>= :: forall a b. NoIO a -> (a -> NoIO b) -> NoIO b
(>>=) NoIO a
k a -> NoIO b
f = IO b -> NoIO b
forall a. IO a -> NoIO a
NoIO (NoIO a -> IO a
forall a. NoIO a -> IO a
noio NoIO a
k IO a -> (a -> IO b) -> IO b
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= NoIO b -> IO b
forall a. NoIO a -> IO a
noio (NoIO b -> IO b) -> (a -> NoIO b) -> a -> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> NoIO b
f)

-- | @since 4.4.0.0
instance GHCiSandboxIO NoIO where
    ghciStepIO :: forall a. NoIO a -> IO a
ghciStepIO = NoIO a -> IO a
forall a. NoIO a -> IO a
noio