gloss-sodium-0.1.0.0: Graphics/Gloss/Interface/FRP/Sodium.hs
{-# LANGUAGE UnicodeSyntax, Rank2Types #-}
module Graphics.Gloss.Interface.FRP.Sodium (playSodium, InputEvent) where
import Graphics.Gloss
import Graphics.Gloss.Interface.IO.Game (playIO)
import qualified Graphics.Gloss.Interface.IO.Game as G
import FRP.Sodium
import Control.Monad (void)
-- | A useful type synonym for Gloss event values, to avoid confusion between
-- Gloss and Sodium.
type InputEvent = G.Event
-- | Play the game in a window, updating when the value of the provided
-- Behavior Picture changes.
playSodium ∷ Display -- ^ The display method
→ Color -- ^ The background colour
→ Int -- ^ The refresh rate, in Hertz
→ ( Event Float
→ Event InputEvent
→ Reactive (Behavior Picture))
-- ^ A Reactive action to generate the Picture Behavior, taking
-- the refresh and input Events with respect to which to build it.
-- The refresh event generates a Float indicating the time delta
-- since the last refresh.
→ IO ()
playSodium display colour frequency mPicture = do
(unreg, bPicture, pushTick, pushInput) ← sync $ do
(eTick, pushTick ) ← newEvent
(eInput, pushInput) ← newEvent
bPicture ← mPicture eTick eInput
-- To avoid https://github.com/kentuckyfriedtakahe/sodium/issues/14
unreg ← listen (value bPicture) . const $ return ()
return (unreg, bPicture, pushTick, pushInput)
playIO display colour frequency ()
(\ _ → sync $ sample bPicture)
(\ ev _ → void . sync $ pushInput ev )
(\ time _ → void . sync $ pushTick time )
unreg