helm-1.0.0: A functionally reactive game engine.

Safe HaskellNone
LanguageHaskell2010

Helm.Cmd

Contents

Description

Contains the command type and related utilities.

Synopsis

Types

newtype Cmd e a Source

Represents an IO-like monad with knowledge about the state of the game engine. Each command contains a collection of game actions that will be applied to your game's update function to update the game state. This is similar to a subscription in a way, with the difference being that a command does not change over time, but rather is a lazy monad and hence contains a value that from the time of the execution. A good example of the usage of a command vs. a subscription is the game window size - a command would allow you to map the current window size into an action, whereas a subscription would let you subscribe to when the window is resized and then map that event into a game action.

Just like a subscription, any function that returns a command in the Helm library will first let you map from the original contained value to a game action. It's important to note that commands are **evaluated on the main-thread** - which means they can block the rendering process. *Don't execute long-running monads under commands!*

Here the type variable e is an instance of the Engine typeclass and the variable a is the game action data type used by your game.

Constructors

Cmd (StateT e IO [a]) 

Utilities

batch Source

Arguments

:: Engine e 
=> [Cmd e a]

The list of commands to combine.

-> Cmd e a

The accumulated command.

Combine a list of commands into a single one.

none :: Engine e => Cmd e a Source

A command that does nothing. When returned in a Helm game's update or initial functions, it will not produce any game actions.

execute Source

Arguments

:: Engine e 
=> IO b

The IO monad to execute.

-> (b -> a)

The function to map the monad result to an action.

-> Cmd e a

The mapped command.

Execute an IO monad and then map its result to a game action. This can be used as a kind of liftIO, however to keep things consistent with the rest of the library, you must map the monad result a game action.