-- | Implementation of user-visible IO. Maybe not a good name for this. module ZMachine.IO where import ZMachine.IO.Base import ZMachine.Base import Control.Monad.State (liftIO, gets) import Control.Concurrent.MVar _zio :: IOOperation -> ZM () _zio op = do f <- gets zs_io_ liftIO $ f op _zioWithMVar :: (MVar a -> IOOperation) -> ZM a _zioWithMVar opf = do mvar <- liftIO $ newEmptyMVar _zio $ opf mvar liftIO $ takeMVar mvar zioRead :: ZM String zioRead = _zioWithMVar IORead zioReadChar :: ZM Char zioReadChar = _zioWithMVar IOReadChar zioWrite :: String -> ZM () zioWrite s = _zio $ IOWrite s zioEraseWindow :: Val -> ZM () zioEraseWindow win = _zio $ IOEraseWindow win zioSetWindow :: Val -> ZM () zioSetWindow win = _zio $ IOSetWindow win zioSplitWindow :: Val -> ZM () zioSplitWindow split = _zio $ IOSplitWindow split zioSetCursor :: Val -> Val -> ZM () zioSetCursor x y = _zio $ IOSetCursor x y