module UIMonad where
import Control.Exception.Safe
import Control.Monad.IO.Class
import qualified Command as Cmd
import qualified Game as G
class (Applicative m, MonadIO m, MonadMask m) => UIMonad m where
runUI :: m a -> IO a
initUI :: m Bool
endUI :: m ()
draw :: G.Game -> m ()
getInput :: m [ Cmd.Command ]
getChRaw :: m ( Maybe Char )
suspend, redraw :: m ()
setAsciiOnly :: Bool -> m ()
toggleAsciiOnly :: m ()
setUIBinding :: Char -> Cmd.Command -> m ()
doUI :: m a -> IO (Maybe a)
doUI m = runUI $ do
ok <- initUI
if ok then Just <$> m `finally` endUI else pure Nothing