module Language.Haskell.Interpreter.Unsafe (
    unsafeSetGhcOption, unsafeRunInterpreterWithArgs, unsafeRunInterpreterWithArgsLibdir,
    unsafeInterpret
) where

import Control.Monad.IO.Class
import Control.Monad.Catch

import Hint.Base
import Hint.Eval
import Hint.Configuration
import Hint.InterpreterT

-- | Set a GHC option for the current session,
--   eg. @unsafeSetGhcOption \"-XNoMonomorphismRestriction\"@.
--
--   Warning: Some options may interact badly with the Interpreter.
unsafeSetGhcOption :: MonadInterpreter m => String -> m ()
unsafeSetGhcOption :: forall (m :: * -> *). MonadInterpreter m => String -> m ()
unsafeSetGhcOption = String -> m ()
forall (m :: * -> *). MonadInterpreter m => String -> m ()
setGhcOption

-- | Executes the interpreter, setting the args as though they were
--   command-line args.  In particular, this means args that have no
--   effect with :set in ghci might function properly from this
--   context.
--
--   Warning: Some options may interact badly with the Interpreter.
unsafeRunInterpreterWithArgs :: (MonadMask m, MonadIO m)
                             => [String]
                             -> InterpreterT m a
                             -> m (Either InterpreterError a)
unsafeRunInterpreterWithArgs :: forall (m :: * -> *) a.
(MonadMask m, MonadIO m) =>
[String] -> InterpreterT m a -> m (Either InterpreterError a)
unsafeRunInterpreterWithArgs = [String] -> InterpreterT m a -> m (Either InterpreterError a)
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
[String] -> InterpreterT m a -> m (Either InterpreterError a)
runInterpreterWithArgs

-- | A variant of @unsafeRunInterpreterWithArgs@ which also lets you
--   specify the folder in which the GHC bootstrap libraries (base,
--   containers, etc.) can be found. This allows you to run hint on
--   a machine in which GHC is not installed.
--
--   A typical libdir value could be @/usr/lib/ghc-8.0.1/ghc-8.0.1@.
unsafeRunInterpreterWithArgsLibdir :: (MonadIO m, MonadMask m)
                                   => [String]
                                   -> String
                                   -> InterpreterT m a
                                   -> m (Either InterpreterError a)
unsafeRunInterpreterWithArgsLibdir :: forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
[String]
-> String -> InterpreterT m a -> m (Either InterpreterError a)
unsafeRunInterpreterWithArgsLibdir = [String]
-> String -> InterpreterT m a -> m (Either InterpreterError a)
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
[String]
-> String -> InterpreterT m a -> m (Either InterpreterError a)
runInterpreterWithArgsLibdir