module LiveCoding.Gloss.PictureM (
module LiveCoding.Gloss.PictureM,
module X,
) where
-- transformers
import Control.Monad.Trans.Class
import Control.Monad.Trans.Reader as X
import Control.Monad.Trans.Writer.Strict
-- gloss
import Graphics.Gloss
import Graphics.Gloss.Interface.IO.Game
-- essence-of-live-coding
import LiveCoding
{- | The monad transformer that captures the effects of gloss,
which are reading events and writing pictures.
You can call these effects for example by...
* ...using 'ask' to read the events that occurred,
* ...composing a cell with 'addPicture' to paint a picture.
-}
type PictureT m = ReaderT [Event] (WriterT Picture m)
-- | 'PictureT' specialised to the 'IO' monad.
type PictureM = PictureT IO
-- | Run the effects of the gloss monad stack by explicitly passing events and pictures.
runPictureT ::
(Monad m) =>
Cell (PictureT m) a b ->
Cell m ([Event], a) (Picture, b)
runPictureT = runWriterC . runReaderC'
addPicture :: (Monad m) => Cell (PictureT m) Picture ()
addPicture = arrM $ lift . tell