X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FServer.hs;h=ff667480bf4e64ff1d94316cb4cd3e2781d10b7d;hb=ba3255afa89fd1faf4c8ed1a01ba482ec5755264;hp=7d00f2382900e454b5b67b32de1a33ffc71a4caa;hpb=9d89c237916fbeed63ca52aa5f93465579a5c576;p=lsp-test.git diff --git a/src/Language/Haskell/LSP/Test/Server.hs b/src/Language/Haskell/LSP/Test/Server.hs index 7d00f23..ff66748 100644 --- a/src/Language/Haskell/LSP/Test/Server.hs +++ b/src/Language/Haskell/LSP/Test/Server.hs @@ -2,27 +2,28 @@ module Language.Haskell.LSP.Test.Server (withServer) where import Control.Concurrent import Control.Monad +import Control.Monad.IO.Class import Language.Haskell.LSP.Test.Compat import System.IO import System.Process -withServer :: String -> Bool -> (Handle -> Handle -> Int -> IO a) -> IO a +withServer :: MonadIO m => String -> Bool -> (Handle -> Handle -> Int -> m a) -> m a withServer serverExe logStdErr f = do -- TODO Probably should just change runServer to accept -- separate command and arguments let cmd:args = words serverExe createProc = (proc cmd args) { std_in = CreatePipe, std_out = CreatePipe, std_err = CreatePipe } - (Just serverIn, Just serverOut, Just serverErr, serverProc) <- createProcess createProc + (Just serverIn, Just serverOut, Just serverErr, serverProc) <- liftIO $ createProcess createProc -- Need to continuously consume to stderr else it gets blocked -- Can't pass NoStream either to std_err - hSetBuffering serverErr NoBuffering - errSinkThread <- forkIO $ forever $ hGetLine serverErr >>= when logStdErr . putStrLn + liftIO $ hSetBuffering serverErr NoBuffering + errSinkThread <- liftIO $ forkIO $ forever $ hGetLine serverErr >>= when logStdErr . putStrLn - pid <- getProcessID serverProc + pid <- liftIO $ getProcessID serverProc result <- f serverIn serverOut pid - killThread errSinkThread - terminateProcess serverProc + liftIO $ killThread errSinkThread + liftIO $ terminateProcess serverProc return result