module Text.LaTeX.Define (
    -- * Defining Commands
    comm0_
  , comm0
  , comm1
  , comm2
  , comm3
  , comm4
  , comm5
  , comm6
  , comm7
  , comm8
  , comm9
  , comm10
  , comm11
  , comm12
    -- * Defining Environments
  , env
  , env2
  , env3
  ) where

import Control.Monad.Writer
import Data.List (intersperse)

import Data.String.Combinators (braces,comma,brackets)

import Text.LaTeX.Monad
import Text.LaTeX.Result

listOpts :: [LaTeX] -> LaTeX
listOpts [] = ""
listOpts xs = brackets . sequence_ . intersperse comma $ xs

--

comm0_ :: LaTeX -> LaTeX
comm0_ = mappend "\\"

comm0 :: LaTeX -> LaTeX
comm0 n = do comm0_ n
             braces ""

comm1 :: LaTeX -> LaTeX -> LaTeX
comm1 n x = do comm0_ n
               braces x

comm2 :: LaTeX -> LaTeX -> [LaTeX] -> LaTeX
comm2 n x opts = do comm1 n x
                    listOpts opts

comm3 :: LaTeX -> [LaTeX] -> LaTeX
comm3 n opts = do comm0_ n
                  listOpts opts

comm4 :: LaTeX -> [LaTeX] -> LaTeX -> LaTeX
comm4 n opts x = do comm3 n opts
                    braces x

comm5 :: LaTeX -> LaTeX -> LaTeX -> LaTeX
comm5 n x y = do comm1 n x
                 braces y

comm6 :: LaTeX -> LaTeX -> [LaTeX] -> LaTeX -> LaTeX
comm6 n x opts y = do comm2 n x opts
                      braces y

comm7 :: LaTeX -> LaTeX -> [LaTeX] -> LaTeX -> LaTeX -> LaTeX
comm7 n x opts y z = do comm6 n x opts y
                        braces z

comm8 :: LaTeX -> LaTeX -> LaTeX
comm8 n x = braces $ do comm0 n
                        x

comm9 :: LaTeX -> [LaTeX] -> LaTeX -> LaTeX -> LaTeX
comm9 n opts x y = do comm4 n opts x
                      braces y

comm10 :: LaTeX -> [LaTeX] -> [LaTeX] -> LaTeX -> LaTeX
comm10 n opts1 opts2 x = do comm3 n opts1
                            listOpts opts2
                            braces x

comm11 :: LaTeX -> LaTeX -> [LaTeX] -> [LaTeX] -> LaTeX -> LaTeX
comm11 n x opts1 opts2 y = do comm2 n x opts1
                              listOpts opts2
                              braces y

comm12 :: LaTeX -> LaTeX -> LaTeX -> LaTeX -> LaTeX
comm12 n x y z = do comm5 n x y
                    braces z

env :: LaTeX -> LaTeX -> LaTeX 
env t x = do comm1 "begin" t
             x
             comm1 "end" t

env2 :: LaTeX -> [LaTeX] -> LaTeX -> LaTeX
env2 t opts x = do comm2 "begin" t opts
                   x
                   comm1 "end" t

env3 :: LaTeX -> [LaTeX] -> LaTeX -> LaTeX -> LaTeX
env3 t opts x y = do comm6 "begin" t opts x
                     y
                     comm1 "end" t