module SpIO(spIO) where
import Command
import Event
import Loopthrough
import Path(Path(..))
import Cont(getRightSP)
import ShowFailure
import Sockets
import Spops
import SP(SP)
import Tables2
import Xtypes
import DialogueSpIO
import DialogueIO hiding (IOError)
spIO :: (SP (Path, Response) (Path, Request)) -> IO ()
spIO mainSP = dialogueSpIO (loopThroughRightSP tagRequestsSP mainSP)
tagRequestsSP = tagRequests dtable0
tagRequests dtable =
getSP $ \msg ->
case msg of
Left (path', cmd) ->
case cmd of
Select ds -> let dtable' = updateDe path' ds dtable
in doReqSP (Select (listDe dtable')) $ \ resp ->
checkErr resp (tagRequests dtable')
XCommand _ -> doReqSP cmd $ \ resp ->
-- The response is to an XCommand is always Success
-- and is not propagated to the originating fudget.
tagRequests dtable
_ -> doReqSP cmd $ \ resp ->
putSP (Left (path', resp)) $
tagRequests dtable
Right ai@(AsyncInput (d, i)) ->
putSP (Left (lookupDe dtable d, ai)) $
tagRequests dtable
checkErr resp cont =
case resp of
Success -> cont
Failure ioerr -> error ("IOerror: " ++ showFailure ioerr)
doReqSP req = putReqSP req . getRespSP
where
putReqSP = putSP . Right
getRespSP = getRightSP