module Text.LaTeX.Base.Writer
(
LaTeXT
, LaTeXT_
, runLaTeXT
, execLaTeXT
, execLaTeXTWarn
, extractLaTeX
, extractLaTeX_
, textell
, liftFun
, liftOp
) where
import Control.Monad.Writer
import Control.Monad.State
import Control.Applicative
import Control.Arrow
import Data.String
import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Render
import Text.LaTeX.Base.Warnings (Warning,checkAll,check)
import Control.Monad (liftM)
newtype LaTeXT m a =
LaTeXT { unwrapLaTeXT :: WriterT LaTeX m a }
deriving (Functor,Applicative,Monad,MonadIO)
instance MonadTrans LaTeXT where
lift = LaTeXT . lift
type LaTeXT_ m = LaTeXT m ()
runLaTeXT :: LaTeXT m a -> m (a,LaTeX)
runLaTeXT = runWriterT . unwrapLaTeXT
execLaTeXT :: Monad m => LaTeXT m a -> m LaTeX
execLaTeXT = liftM snd . runLaTeXT
execLaTeXTWarn :: Monad m => LaTeXT m a -> m (LaTeX,[Warning])
execLaTeXTWarn = liftM (id &&& check checkAll) . execLaTeXT
extractLaTeX :: Monad m => LaTeXT m a -> LaTeXT m (a,LaTeX)
extractLaTeX = LaTeXT . lift . runLaTeXT
extractLaTeX_ :: Monad m => LaTeXT m a -> LaTeXT m LaTeX
extractLaTeX_ = liftM snd . extractLaTeX
textell :: Monad m => LaTeX -> LaTeXT m ()
textell = LaTeXT . tell
liftFun :: Monad m
=> (LaTeX -> LaTeX)
-> (LaTeXT m a -> LaTeXT m a)
liftFun f ml = do
(a,l') <- lift $ do
(a,l) <- runLaTeXT ml
let l' = f l
return (a,l')
textell l'
return a
liftOp :: Monad m
=> (LaTeX -> LaTeX -> LaTeX)
-> (LaTeXT m a -> LaTeXT m a -> LaTeXT m a)
liftOp op ml1 ml2 = do
(a,l') <- lift $ do
(_,l1) <- runLaTeXT ml1
(a,l2) <- runLaTeXT ml2
let l' = l1 `op` l2
return (a,l')
textell l'
return a
instance Monad m => IsString (LaTeXT m a) where
fromString = (>> return undefined) . textell . fromString