1 module Language.Haskell.LSP.Test.Machine where
3 import Control.Monad.IO.Class
4 import Language.Haskell.LSP.Messages
5 import Language.Haskell.LSP.Test
7 data State = State String (FromServerMessage -> Bool) [Session ()] State
11 data Event = TimeoutEvent | Received FromServerMessage
13 advance :: State -> Event -> Session State
14 advance _ TimeoutEvent = return Failed
15 advance s@(State name f actions next) (Received msg)
17 liftIO $ putStrLn name
20 | otherwise = return s
21 advance s _ = return s
24 mkStates ((n, f, msgs):xs) = State n f msgs (mkStates xs)
26 runMachine :: String -> FilePath -> [(String, FromServerMessage -> Bool, [Session ()])] -> IO Bool
27 runMachine cmd rootDir encodedStates =
28 runSession cmd rootDir $ do
29 let f Passed = return Passed
30 f s = Received <$> anyMessage >>= advance s >>= f
31 initState = mkStates encodedStates