| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
FRP.Rhine.Gloss.IO
Description
Wrapper to write gloss applications in Rhine, using concurrency.
Synopsis
- data GlossEnv = GlossEnv {}
- newtype GlossConcT m a = GlossConcT {
- unGlossConcT :: ReaderT GlossEnv (FreeAsyncT m) a
- type GlossConc = GlossConcT IO
- runGlossConcT :: MonadIO m => GlossConcT m a -> GlossEnv -> m a
- paintIO :: MonadIO m => Picture -> GlossConcT m ()
- clearIO :: MonadIO m => GlossConcT m ()
- paintAllIO :: MonadIO m => Picture -> GlossConcT m ()
- data GlossEventClockIO = GlossEventClockIO
- data GlossSimClockIO = GlossSimClockIO
- makeGlossEnv :: MonadIO m => m GlossEnv
- launchInGlossThread :: MonadIO m => GlossSettings -> GlossConcT m a -> m a
- launchGlossThread :: MonadIO m => GlossSettings -> m GlossEnv
- flowGlossIO :: (MonadIO m, Clock (GlossConcT m) cl, GetClockProxy cl, Time cl ~ Time (In cl), Time cl ~ Time (Out cl)) => GlossSettings -> Rhine (GlossConcT m) cl () () -> m ()
- runGlossEnvClock :: MonadIO m => GlossEnv -> cl -> RunGlossEnvClock m cl
- type RunGlossEnvClock m cl = HoistClock (GlossConcT m) m cl
- type GlossClockUTC m cl = UTCClock (GlossConcT m) cl
- glossClockUTC :: (MonadIO m, Real (Time cl)) => cl -> GlossClockUTC m cl
- type GlossConcTClock m = HoistClock IO (GlossConcT m)
- glossConcTClock :: MonadIO m => cl -> GlossConcTClock m cl
- type GlossConcClock = GlossConcTClock IO
- glossConcClock :: cl -> GlossConcClock cl
Documentation
Concurrent variables needed to communicate with the gloss backend.
newtype GlossConcT m a Source #
Effects in the gloss backend
- Wraps the concurrent variables needed for communication with the
glossbackend. - Adds the
FreeAsyncTconcurrency layer for fairer scheduling
Constructors
| GlossConcT | |
Fields
| |
Instances
type GlossConc = GlossConcT IO Source #
When gloss is the only effect you are using, use this monad to simplify your type signatures.
runGlossConcT :: MonadIO m => GlossConcT m a -> GlossEnv -> m a Source #
Remove the GlossConcT transformer by explicitly providing an environment.
clearIO :: MonadIO m => GlossConcT m () Source #
Clear the canvas.
paintAllIO :: MonadIO m => Picture -> GlossConcT m () Source #
Clear the canvas and then paint.
data GlossEventClockIO Source #
Concurrently block on gloss events.
Caution: Currently, you should only add one such clock in a Rhine.
If you add several GlossEventClockIO, only one will be chosen at random and receive the event.
See https://github.com/turion/rhine/issues/330.
Constructors
| GlossEventClockIO |
Instances
| GetClockProxy GlossEventClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO Methods | |
| MonadIO m => Clock (GlossConcT m) GlossEventClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO Methods initClock :: GlossEventClockIO -> RunningClockInit (GlossConcT m) (Time GlossEventClockIO) (Tag GlossEventClockIO) # | |
| type Tag GlossEventClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO | |
| type Time GlossEventClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO | |
data GlossSimClockIO Source #
Concurrently block on gloss simulation ticks.
Caution: Currently, you should only add one such clock in a Rhine.
If you add several GlossSimClockIO, only one will be chosen at random and receive the event.
See https://github.com/turion/rhine/issues/330.
Constructors
| GlossSimClockIO |
Instances
| GetClockProxy GlossSimClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO Methods | |
| MonadIO m => Clock (GlossConcT m) GlossSimClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO Methods initClock :: GlossSimClockIO -> RunningClockInit (GlossConcT m) (Time GlossSimClockIO) (Tag GlossSimClockIO) # | |
| type Tag GlossSimClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO | |
| type Time GlossSimClockIO Source # | |
Defined in FRP.Rhine.Gloss.IO | |
makeGlossEnv :: MonadIO m => m GlossEnv Source #
Create the concurrent variables to communicate with the gloss backend.
You will usually not need this function, have a look at launchInGlossThread and flowGlossIO instead.
launchInGlossThread :: MonadIO m => GlossSettings -> GlossConcT m a -> m a Source #
Apply this to supply the GlossConcT effect.
Creates a new thread in which gloss is run,
and feeds the clocks GlossEventClockIO and GlossSimClockIO.
Usually, this function is applied to the result of flow,
so you can handle all occurring effects as needed.
If you only use gloss in your whole signal network,
you can use flowGlossIO instead.
launchGlossThread :: MonadIO m => GlossSettings -> m GlossEnv Source #
Helper function for launchInGlossThread.
Creates concurrent variables and launches the gloss backend in a separate thread.
flowGlossIO :: (MonadIO m, Clock (GlossConcT m) cl, GetClockProxy cl, Time cl ~ Time (In cl), Time cl ~ Time (Out cl)) => GlossSettings -> Rhine (GlossConcT m) cl () () -> m () Source #
Run a Rhine in the GlossConcT monad by launching a separate thread for the gloss backend,
and reactimate in the foreground.
runGlossEnvClock :: MonadIO m => GlossEnv -> cl -> RunGlossEnvClock m cl Source #
Apply to a gloss clock to remove a GlossConcT layer.
You will have to have initialized a GlossEnv, for example by calling launchGlossThread.
type RunGlossEnvClock m cl = HoistClock (GlossConcT m) m cl Source #
Apply this wrapper to your clock type cl in order to escape the GlossConcT transformer.
The resulting clock will be in m, not 'GlossConcT m' anymore.
Typically, m will have the MonadIO constraint.
type GlossClockUTC m cl = UTCClock (GlossConcT m) cl Source #
Rescale a gloss clock like GlossSimClockIO or GlossEventClockIO to UTCTime.
This is needed for compatibility with other realtime clocks like Millisecond.
glossClockUTC :: (MonadIO m, Real (Time cl)) => cl -> GlossClockUTC m cl Source #
Rescale a gloss clock like GlossSimClockIO or GlossEventClockIO to UTCTime.
Uses addUTC. For other strategies to rescale a gloss clock to UTCTime,
see FRP.Rhine.Clock.Realtime.
type GlossConcTClock m = HoistClock IO (GlossConcT m) Source #
Lift a MonadIO clock to GlossConcT.
You should use this instead of IOClock, otherwise scheduling will probably not work.
(This is because GlossConcT uses FreeAsyncT, but liftIO is not asynchronous.)
glossConcTClock :: MonadIO m => cl -> GlossConcTClock m cl Source #
A MonadIO clock lifted to GlossConcT.
type GlossConcClock = GlossConcTClock IO Source #
Lift an IO clock to GlossConc.
See GlossConcTClock.
glossConcClock :: cl -> GlossConcClock cl Source #