Safe Haskell | None |
---|---|
Language | Haskell2010 |
Documentation
dispatchActionAsync :: (MonadIO m, HasStates base, Typeable m, Typeable base) => IO (AppT base m ()) -> ActionT base zoomed m () Source #
Dispatch an action which is generated by some IO. Note that state of the application may have changed
between calling dispatchActionAsync
and running the resulting Action
asyncActionProvider :: (MonadIO m, HasStates base, Typeable m, Typeable base) => ((AppT base m () -> IO ()) -> IO ()) -> ActionT base zoomed m () Source #
This allows long-running IO processes to provide Action
s to the application asyncronously.
asyncEventProvider
is simpler to use, however asyncActionProvider
provides
more power and expressivity. When in doubt, asyncEventProvider
probably meets
your needs.
Don't let the type signature confuse you; it's much simpler than it seems.
Let's break it down:
When you call asyncActionProvider
you pass it a function which accepts a dispatch
function as an argument
and then calls it with various Action
s within the resulting IO
. The
dispatch
function it is passed will have type (App () -> IO ())
Note that this function calls forkIO internally, so there's no need to do that yourself.
Here's an example:
data Timer = Timer myTimer :: (App () -> IO ()) -> IO () myTimer dispatch = forever $ dispatch (myInt += 1) >> threadDelay 1000000 myInit :: App () myInit = asyncActionProvider myTimer