Write gloss-dunai compatibility layer
This commit is contained in:
parent
d4799c3dc4
commit
c4065b4b1b
14
src/Main.hs
Normal file
14
src/Main.hs
Normal file
|
@ -0,0 +1,14 @@
|
|||
{-# LANGUAGE Arrows #-}
|
||||
|
||||
module Main where
|
||||
|
||||
import Data.MonadicStreamFunction
|
||||
import Graphics.Gloss
|
||||
import Utils
|
||||
|
||||
mainSF :: MSF Drawer () ()
|
||||
mainSF = proc () -> do
|
||||
draw -< color white $ circleSolid 40
|
||||
|
||||
main :: IO ()
|
||||
main = playMSF FullScreen black 60 (runDrawerS mainSF)
|
42
src/Utils.hs
Normal file
42
src/Utils.hs
Normal file
|
@ -0,0 +1,42 @@
|
|||
module Utils where
|
||||
|
||||
import Control.Monad.Trans.MSF.Reader
|
||||
import Control.Monad.Trans.MSF.Writer
|
||||
import Data.IORef
|
||||
import Data.MonadicStreamFunction
|
||||
import Data.MonadicStreamFunction.ReactHandle
|
||||
import Graphics.Gloss
|
||||
import Graphics.Gloss.Interface.IO.Game
|
||||
|
||||
-- | Display an MSF outputting a picture value as a window using Gloss.
|
||||
-- Note that the MSF is not passed a real-time clock.
|
||||
playMSF :: Display -> Color -> Int -> MSF IO (Maybe Event) Picture -> IO ()
|
||||
playMSF display color freq msf = do
|
||||
-- `react` doesn't allow inputs or outputs, so we have to use IORefs
|
||||
evRef <- newIORef Nothing
|
||||
picRef <- newIORef blank
|
||||
|
||||
handle <- reactInit (constM (readIORef evRef) >>> msf >>> arrM (writeIORef picRef))
|
||||
|
||||
let -- An action to convert the world to a picture.
|
||||
toPic _ = readIORef picRef
|
||||
|
||||
-- A function to handle input events.
|
||||
handleInput e _ = do
|
||||
writeIORef evRef (Just e)
|
||||
react handle
|
||||
|
||||
-- A function to step the world one iteration.
|
||||
stepWorld _ _ = do
|
||||
writeIORef evRef Nothing
|
||||
react handle
|
||||
|
||||
playIO display color freq () toPic handleInput stepWorld
|
||||
|
||||
type Drawer = WriterT Picture (ReaderT (Maybe Event) IO)
|
||||
|
||||
runDrawerS :: MSF Drawer () () -> MSF IO (Maybe Event) Picture
|
||||
runDrawerS msf = arr (,()) >>> runReaderS (runWriterS msf) >>> arr fst
|
||||
|
||||
draw :: MSF Drawer Picture ()
|
||||
draw = arrM tell
|
Loading…
Reference in a new issue