content: 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
  