module FRP.Spice.Graphics.Scene ( Scene
, fromRenderables
, renderScene
) where
import Control.Applicative
import Control.Monad
import FRP.Spice.Graphics.Renderable
data SceneT a = SceneT [Render] a
type Scene = SceneT ()
instance Functor SceneT where
fmap fn (SceneT renderables v) = SceneT renderables $ fn v
instance Applicative SceneT where
pure = return
(<*>) = ap
instance Monad SceneT where
return a = SceneT [] a
(SceneT renderables v) >>= fn =
let (SceneT renderables' v') = fn v in
SceneT (renderables ++ renderables') v'
fromRenderables :: Renderable a => [a] -> Scene
fromRenderables renderables =
SceneT (map toRender renderables) ()
renderScene :: Scene -> IO ()
renderScene (SceneT renderables _) =
forM_ renderables runRender