reserve-0.1.0: src/Interpreter.hs
{-# LANGUAGE CPP #-}
module Interpreter (
Interpreter
, new
, terminate
, start
, stop
, reload
) where
import System.Process
import System.Process.Internals
import System.IO
import System.Posix.Signals hiding (signalProcess)
import qualified System.Posix.Signals as Posix
import Control.Concurrent
data Interpreter = Interpreter ProcessHandle Handle
new :: FilePath -> IO Interpreter
new src = do
(Just hIn, Nothing, Nothing, processHandle) <- createProcess $ (proc "ghci" ["-v0", src]) {std_in = CreatePipe}
return (Interpreter processHandle hIn)
terminate :: Interpreter -> IO ()
terminate i@(Interpreter p h) = stop i >> hClose h >> waitForProcess p >> return ()
start :: Interpreter -> [String] -> IO ()
start (Interpreter _ h) args = hPutStrLn h (unwords $ ":main" : args) >> hFlush h
stop :: Interpreter -> IO ()
stop (Interpreter p _) = signalProcess sigINT p
reload :: Interpreter -> IO ()
reload (Interpreter _ h) = hPutStrLn h ":reload" >> hFlush h
signalProcess :: Signal -> ProcessHandle -> IO ()
#if MIN_VERSION_process(1,2,0)
signalProcess signal (ProcessHandle mvar _) =
#else
signalProcess signal (ProcessHandle mvar) =
#endif
withMVar mvar $ \p -> case p of
OpenHandle pid -> Posix.signalProcess signal pid
_ -> return ()