{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE LambdaCase #-}
module Terminal.Game.Layer.Object.Interface where
import Terminal.Game.Plane
import Terminal.Game.Layer.Object.Primitive
import qualified Control.Concurrent as CC
type MonadGameIO m = (MonadInput m, MonadTimer m,
MonadException m, MonadDisplay m)
data InputHandle = InputHandle
{ InputHandle -> MVar [Event]
ihKeyMVar :: CC.MVar [Event],
InputHandle -> [ThreadId]
ihOpenThreads :: [CC.ThreadId] }
class Monad m => MonadInput m where
startEvents :: TPS -> m InputHandle
pollEvents :: CC.MVar [Event] -> m [Event]
stopEvents :: [CC.ThreadId] -> m ()
areEventsOver :: m Bool
class Monad m => MonadTimer m where
getTime :: m Integer
sleepABit :: TPS -> m ()
class Monad m => MonadException m where
cleanUpErr :: m a -> m b -> m a
throwExc :: ATGException -> m a
class Monad m => MonadDisplay m where
setupDisplay :: m ()
clearDisplay :: m ()
displaySize :: m (Maybe Dimensions)
blitPlane :: Maybe Plane -> Plane -> m ()
shutdownDisplay :: m ()
displaySizeErr :: (MonadDisplay m, MonadException m) => m Dimensions
displaySizeErr :: forall (m :: * -> *).
(MonadDisplay m, MonadException m) =>
m Dimensions
displaySizeErr = forall (m :: * -> *). MonadDisplay m => m (Maybe Dimensions)
displaySize forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Maybe Dimensions
Nothing -> forall (m :: * -> *) a. MonadException m => ATGException -> m a
throwExc ATGException
CannotGetDisplaySize
Just Dimensions
d -> forall (m :: * -> *) a. Monad m => a -> m a
return Dimensions
d