module DialogueSpIO where import System.IO(hFlush,stdout) import SP import DoRequest(initXCall,doRequest,getAsyncInput) import DialogueIO(Request(XCommand,GetAsyncInput),Response) import Queue import CmdLineEnv(argFlag) --dialogueSpIO :: SP FResponse FRequest -> IO () {- --Old, simple implementation: dialogueSpIO sp = case sp of PutSP req sp' -> do resp <- doRequest req dialogueSpIO (startupSP [resp] sp') GetSP xsp -> do resp <- doRequest GetAsyncInput dialogueSpIO (xsp resp) NullSP -> return () -} dialogueSpIO = if argFlag "dialogue-to-stdio" False then stdioDialogueSpIO else normalDialogueSpIO normalDialogueSpIO sp = do iostate <- initXCall dialogueSpIO' (doRequest iostate) (getAsyncInput iostate) sp stdioDialogueSpIO :: SP Response Request -> IO () stdioDialogueSpIO = dialogueSpIO' doRequest getAsyncInput where doRequest req = do print req hFlush stdout readLn getAsyncInput = doRequest GetAsyncInput -- More efficient queueing of responses dialogueSpIO' doRequest getAsyncInput sp = doIO sp empty where doIO sp respq = case sp of PutSP req sp' -> case req of -- The response to an XCommand is always Success -- and is not propagated to the originating fudget. XCommand {} -> doRequest req >> doIO sp' respq _ -> doIO sp' . enter respq =<< doRequest req GetSP xsp -> case qremove respq of Just (resp,respq') -> doIO (xsp resp) respq' Nothing -> do resp <- getAsyncInput doIO (xsp resp) respq NullSP -> return ()