{- |
This module exports those minimal things you need
to work with HaTeX. Those things are:

* The 'LaTeX' datatype.

* The '<>' operator, to append 'LaTeX' values.

* The "Text.LaTeX.Base.Render" module, to render a 'LaTeX' value into 'Text'.

* The "Text.LaTeX.Base.Types" module, which contains several types used by
  other modules.

* The "Text.LaTeX.Base.Writer" module, needed to run the 'LaTeXT' monad, and
  obtain a result of type 'LaTeX'.

* The "Text.LaTeX.Base.Commands.Monad" module, which exports the LaTeX standard commands
  and environments.

Here is also defined a 'Num' instance for 'LaTeXT'.
-}
module Text.LaTeX.Base.Monad
 ( LaTeX , (<>)
 , module Text.LaTeX.Base.Render
 , module Text.LaTeX.Base.Types
 , module Text.LaTeX.Base.Writer
 , module Text.LaTeX.Base.Commands.Monad
   ) where

import Text.LaTeX.Base.Syntax (LaTeX,(<>))
import Text.LaTeX.Base.Render
import Text.LaTeX.Base.Types
import Text.LaTeX.Base.Writer
import Text.LaTeX.Base.Commands.Monad
-- Import LaTeX Num instance
import Text.LaTeX.Base ()
-- Import 'lift' function
import Control.Monad.Trans.Class (lift)

-- Num instance for LaTeXT

-- Sadly, we need 'Show' and 'Eq' instances for LaTeXT in order
-- to do its 'Num' instance.

-- | Don't use it! This instance only exists in order to
--   define a 'Num' instance to 'LaTeXT'.
instance Show (LaTeXT m a) where
 show _   = error "Cannot use \"show\" Show method with a LaTeXT value."

-- | Don't use it! This instance only exists in order to
--   define a 'Num' instance to 'LaTeXT'.
instance Eq (LaTeXT m a) where
 _ == _ = error "Cannot use \"(==)\" Eq method with a LaTeXT value."

-- | Be careful when using 'fromInteger' over a 'LaTeXT' value,
--   the returned value of the computation is bottom (i.e. 'undefined').
--   Methods 'abs' and 'signum' are undefined. Don't use them!
instance Monad m => Num (LaTeXT m a) where
 (+) = liftOp (+)
 (-) = liftOp (-)
 (*) = (>>)
 negate = liftFun negate
 fromInteger = fromString . show
 -- Non-defined methods
 abs _    = "Cannot use \"abs\" Num method with a LaTeXT value."
 signum _ = "Cannot use \"signum\" Num method with a LaTeXT value."