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
gloss
backend. - Adds the
FreeAsyncT
concurrency 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 #