40 lines
1.1 KiB
Haskell
40 lines
1.1 KiB
Haskell
{-# LANGUAGE LambdaCase #-}
|
|
|
|
module Graphics.Engine where
|
|
|
|
import Control.Arrow
|
|
import Control.Monad.Representable.Reader
|
|
import FRP.Yampa
|
|
import GOL.Engine
|
|
import GOL.Space
|
|
import Graphics.Config
|
|
import Graphics.Gloss
|
|
import Graphics.Gloss.Interface.IO.Game hiding (Event)
|
|
import qualified Graphics.Gloss.Interface.IO.Game as G
|
|
import Graphics.GlossUtils (InputEvent)
|
|
|
|
type TickEvent = Event ()
|
|
|
|
initialSpace :: Space f => f Bool
|
|
initialSpace = tabulate $ const False
|
|
|
|
engine :: Space f => GOL f Bool -> SF TickEvent (GOL f Bool)
|
|
engine = accumHoldBy (\s _ -> tick s)
|
|
|
|
defaultPeriod = 0.5
|
|
|
|
repeatTick :: Time -> SF a TickEvent
|
|
repeatTick t = repeatedly t ()
|
|
|
|
tickSignal :: SF (Event Time) TickEvent
|
|
tickSignal =
|
|
arr (\ev -> ((), fmap repeatTick ev))
|
|
>>> drSwitch (repeatTick defaultPeriod)
|
|
|
|
run :: SF InputEvent Picture
|
|
run = arr (fmap processEvent) >>> accum defaultConfig >>> ()
|
|
where
|
|
processEvent :: G.Event -> Config -> Config
|
|
processEvent (EventKey (Char '-') Down _ _) c = c {tickPeriod = tickPeriod c * 0.8}
|
|
processEvent (EventResize s) c = c {windowSize = s}
|
|
processEvent _ c = c |