| Copyright | (c) 2019 Commonwealth Scientific and Industrial Research Organisation (CSIRO) |
|---|---|
| License | BSD-3 |
| Maintainer | dave.laing.80@gmail.com, jack.kelly@data61.csiro.au |
| Safe Haskell | None |
| Language | Haskell2010 |
Reflex.Host.Basic
Contents
Description
BasicGuest provides instances that most Reflex programs need:
MonadIOMonadFixMonadSampleMonadHoldNotReadyPostBuildPerformEvent—hasPerformable(BasicGuestt m)MonadIOTriggerEventAdjustable
For some usage examples, see the example directory.
Synopsis
- basicHostWithQuit :: (forall t m. BasicGuestConstraints t m => BasicGuest t m (Event t ())) -> IO ()
- basicHostForever :: (forall t m. BasicGuestConstraints t m => BasicGuest t m ()) -> IO ()
- data BasicGuest t (m :: * -> *) a
- type BasicGuestConstraints t (m :: * -> *) = (MonadReflexHost t m, MonadHold t m, MonadSample t m, Ref m ~ Ref IO, MonadRef (HostFrame t), Ref (HostFrame t) ~ Ref IO, MonadIO (HostFrame t), PrimMonad (HostFrame t), MonadIO m, MonadFix m)
- repeatUntilQuit :: BasicGuestConstraints t m => IO a -> Event t () -> BasicGuest t m (Event t a)
- repeatUntilQuit_ :: BasicGuestConstraints t m => IO a -> Event t () -> BasicGuest t m ()
Running the host
basicHostWithQuit :: (forall t m. BasicGuestConstraints t m => BasicGuest t m (Event t ())) -> IO () Source #
Run a BasicGuest, and return when the Event returned by the
BasicGuest fires.
Each host runs on a separate spider timeline, so you can launch
multiple hosts via forkIO or
forkOS and they will not mutex each other.
NOTE: If you want to capture values from a build before the network
starts firing (e.g., to hand off event triggers to another thread),
populate an MVar (if threading) or
IORef as you build the network. If you receive errors
about untouchable type variables while doing this, add type
annotations to constrain the MVar or
IORef contents before passing them to the function
that returns your BasicGuest. See the Multithread.hs example
for a demonstration of this pattern, and where to put the type
annotations.
basicHostForever :: (forall t m. BasicGuestConstraints t m => BasicGuest t m ()) -> IO () Source #
Run a BasicGuest without a quit Event.
basicHostForever guest = basicHostWithQuit $ never <$ guest
Types
data BasicGuest t (m :: * -> *) a Source #
The basic guest type. Try not to code against it directly; instead ask for the features you need MTL-style:
myFunction :: (Reflex t, MonadHold m) => ...
Instances
type BasicGuestConstraints t (m :: * -> *) = (MonadReflexHost t m, MonadHold t m, MonadSample t m, Ref m ~ Ref IO, MonadRef (HostFrame t), Ref (HostFrame t) ~ Ref IO, MonadIO (HostFrame t), PrimMonad (HostFrame t), MonadIO m, MonadFix m) Source #
Constraints provided by a BasicGuest, when run by
basicHostWithQuit or basicHostForever.
Utilities
Arguments
| :: BasicGuestConstraints t m | |
| => IO a | Action to repeatedly run |
| -> Event t () |
|
| -> BasicGuest t m (Event t a) |
Augment a BasicGuest with an action that is repeatedly run
until the provided Event fires. Each time the action completes,
the returned Event will fire.
Example - providing a 'tick' Event to a network
myNetwork
:: (Reflex t, MonadHold t m, MonadFix m)
=> Event t ()
-> m (Dynamic t Int)
myNetwork = count
myGuest :: BasicGuestConstraints t m => BasicGuest t m (Event t ())
myGuest = mdo
eTick <- repeatUntilQuit (void $ threadDelay 1000000) eQuit
let
eCountUpdated = updated dCount
eQuit = () <$ ffilter (==5) eCountUpdated
dCount <- myNetwork eTick
performEvent_ $ liftIO . print <$> eCountUpdated
pure eQuit
main :: IO ()
main = basicHostWithQuit myGuest
Arguments
| :: BasicGuestConstraints t m | |
| => IO a | Action to repeatedly run |
| -> Event t () |
|
| -> BasicGuest t m () |
Like repeatUntilQuit, but it doesn't do anything with the
result of the action. May be a little more efficient if you don't
need it.