packages feed

fearOfView-0.1.0.0: UIMonad.hs

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