HaTeX-2.0.0: Text/LaTeX/Monad.hs
{-# LANGUAGE OverloadedStrings,TypeSynonymInstances #-}
module Text.LaTeX.Monad (
-- * @LaTeX@ Monad
LaTeXT
, LaTeX
-- * Basic functions over @LaTeX@ Monad
, lx
, lxany
, lxw
, lxanyw
, nlx
, mlx
, reslx
-- * Generalizing
, genlx , ungenlx
) where
import Control.Monad.Writer
import Data.Monoid
import GHC.Exts
import System.IO.Unsafe
import Text.LaTeX.Result
import Data.String.Combinators(fromShow)
----------------------------
-- | 'LaTeXT' is the monadic transformer that represents LaTeX code.
-- Bind operator plays as concatenator.
--
-- Instances of 'LaTeXT':
--
-- * 'IsString'
--
-- * 'Num'
--
-- * 'Fractional'
--
-- * 'Floating'
--
-- * 'Monoid'
type LaTeXT m a = WriterT Result m a
type LaTeX m = LaTeXT m ()
----------------------------
-- Running the Monad
-- | Run a 'LaTeXT' computation.
nlx :: Monad m => LaTeXT m a -> m Result
nlx = execWriterT
----------------------------
-- | Write a result.
lx :: Monad m => Result -> LaTeX m
lx = tell
-- | Write anything of 'Show' class.
lxany :: (Monad m , Show a) => a -> LaTeX m
lxany = ungenlx . lxanyw
-- | Like 'lx', but returns an undefined value.
lxw :: Monad m => Result -> LaTeXT m a
lxw = genlx . lx
-- | Like 'lxany', but returns an undefined value.
lxanyw :: (Monad m , Show b) => b -> LaTeXT m a
lxanyw = fromShow
-- | Performs a monadic computation, returning his value in the 'LaTeXT' monad.
mlx :: Monad m => m a -> LaTeXT m a
mlx = lift
-- | Transform a 'Result' modifier in a 'LaTeXT' modifier.
reslx :: Monad m => (Result -> Result) -> (LaTeXT m a -> LaTeXT m a)
reslx = censor
instance Monad m => IsString (LaTeXT m a) where
fromString = lxw . toResult
instance Monad m => Show (LaTeXT m a) where
show _ = ""
instance Monad m => Eq (LaTeXT m a) where
_ == _ = error "(==): LaTeXT values can't be compared."
instance Monad m => Monoid (LaTeXT m a) where
mempty = ""
mappend = (>>)
-- Generalizing
genlx :: Monad m => LaTeX m -> LaTeXT m a
genlx = (>> return undefined)
ungenlx :: Monad m => LaTeXT m a -> LaTeX m
ungenlx = (>> return ())