imj-base-0.1.0.2: src/Imj/Graphics/Render/FromMonadReader.hs
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Imj.Graphics.Render.FromMonadReader
(
-- ** Draw char(s)
drawChar
, drawChars
-- ** Draw text
, drawTxt
, drawStr
, drawColorStr
-- ** Draw aligned text
, drawAlignedTxt_
, drawAlignedTxt
, drawAlignedColorStr
-- ** Render to the physical device
, renderToScreen
) where
import Imj.Prelude
import Control.Monad(join)
import Control.Monad.IO.Class(MonadIO)
import Control.Monad.Reader.Class(MonadReader, asks)
import Data.Text(Text)
import Imj.Geo.Discrete.Types
import Imj.Graphics.Class.Draw
import Imj.Graphics.Class.Render
import Imj.Graphics.Color(LayeredColor(..))
import Imj.Graphics.Text.Alignment
import Imj.Graphics.Text.ColorString
-- | Draw a 'ColorString'.
{-# INLINABLE drawColorStr #-}
drawColorStr :: (Draw e, MonadReader e m, MonadIO m)
=> ColorString -> Coords Pos -> m ()
drawColorStr cs pos = do
d <- asks drawColorStr'
d cs pos
-- | Draw a 'ColorString' with an 'Alignment' constraint.
{-# INLINABLE drawAlignedColorStr #-}
drawAlignedColorStr :: (Draw e, MonadReader e m, MonadIO m)
=> Alignment -> ColorString -> m Alignment
drawAlignedColorStr a cs = do
d <- asks drawAlignedColorStr'
d a cs
-- | Draws text with 'Alignment'.
{-# INLINABLE drawAlignedTxt_ #-}
drawAlignedTxt_ :: (Draw e, MonadReader e m, MonadIO m)
=> Text
-> LayeredColor
-> Alignment
-> m ()
drawAlignedTxt_ txt colors a = do
d <- asks drawAlignedTxt_'
d txt colors a
-- | Draws text with 'Alignment'.
--
-- Returns the 'Alignment' projected on the next line.
{-# INLINABLE drawAlignedTxt #-}
drawAlignedTxt :: (Draw e, MonadReader e m, MonadIO m)
=> Text
-> LayeredColor
-> Alignment
-> m Alignment
drawAlignedTxt txt colors a = do
d <- asks drawAlignedTxt'
d txt colors a
{-# INLINABLE drawTxt #-}
drawTxt :: (Draw e, MonadReader e m, MonadIO m)
=> Text
-> Coords Pos
-> LayeredColor
-> m ()
drawTxt txt co la = do
d <- asks drawTxt'
d txt co la
{-# INLINABLE drawStr #-}
drawStr :: (Draw e, MonadReader e m, MonadIO m)
=> String
-> Coords Pos
-> LayeredColor
-> m ()
drawStr str co la = do
d <- asks drawStr'
d str co la
-- | Draws a 'Char' multiple times, starting at the given coordinates and then
-- moving to the right.
{-# INLINABLE drawChars #-}
drawChars :: (Draw e, MonadReader e m, MonadIO m)
=> Int
-> Char
-> Coords Pos
-> LayeredColor
-> m ()
drawChars i c co la = do
d <- asks drawChars'
d i c co la
{-# INLINABLE drawChar #-}
drawChar :: (Draw e, MonadReader e m, MonadIO m)
=> Char
-> Coords Pos
-> LayeredColor
-> m ()
drawChar c co la = do
d <- asks drawChar'
d c co la
-- | Render the drawing to {the screen, the console, etc...}.
{-# INLINABLE renderToScreen #-}
renderToScreen :: (Render e, MonadReader e m, MonadIO m)
=> m ()
renderToScreen =
join (asks renderToScreen')