-- |
-- Module      : Math.LaTeX.Prelude
-- Copyright   : (c) Justus Sagemüller 2017
-- License     : GPL v3
-- 
-- Maintainer  : (@) jsagemue $ uni-koeln.de
-- Stability   : experimental
-- Portability : requires GHC>7 extensions
-- 
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE CPP               #-}

module Math.LaTeX.Prelude (
     LaTeXMath
   -- * Primitive symbols
   , LaTeXSymbol
   -- ** Unicode literals
   , module CAS.Dumb.Symbols.Unicode.MathLatin_RomanGreek__BopomofoGaps
   -- $unicodeLiterals
   , LaTeXMath__MathLatin_RomanGreek__BopomofoGaps
   -- ** Custom symbol-literals
   -- $nonunicodeLiterals

   -- ** Symbol modifiers
   , (%$>), prime
   , LaTeX.dot, LaTeX.ddot, LaTeX.bar, LaTeX.hat
   , LaTeX.vec, LaTeX.underline, LaTeX.tilde
   -- * Maths operators
   , (°), (), (...)
#if __GLASGOW_HASKELL__ > 801
   , (،..،), (،), (⸪=), (=⸪)
#endif
   , (), (+..+), (*..*), (×), (), (), factorial
   , (), (◝⁀), (), (◞◝), (|◞), (|◝), (|◞◝)
   , (), (), (⩵!), (), (), (), (), (), (), (), (), (), (), (₌₌)
   , (=→), (←=), (), (), (), ()
   , (), (/⊂), (), (), (), (), (), (), (), (), (), (-\-), (), ()
   , (∀:), (∃:)
   , (-→), (), (), (==>), (<==), (<=>), (), ()
   , (), (◞∫), (◞∮), d, (), (◞∑), (), (◞∏), del, nabla
   , (<.<), (≤.<), (<.≤), (≤.≤), (±), (), set, tup, intv
   , infty, norm
   , nobreaks, matrix, cases
   -- * Algebraic manipulation
   -- #algebraManip
   , (&~~!), (&~~:), continueExpr, (&)
   , (&~:), (&~?), (&~!), (|->)
   -- * Use in documents
   , (Math.LaTeX.Prelude.$<>), (Math.LaTeX.Prelude.>$)
   , dmaths, maths, equations, dcalculation, toMathLaTeX
   ) where

import CAS.Dumb.Symbols.Unicode.MathLatin_RomanGreek__BopomofoGaps hiding ((%$>))
import CAS.Dumb.Symbols
import Math.LaTeX.Internal.MathExpr
import Math.LaTeX.Internal.Display

import Text.LaTeX.Base.Class (LaTeXC)
import Text.LaTeX.Base (raw, LaTeX)
import qualified Text.LaTeX.Packages.AMSMath as LaTeX
import qualified Text.LaTeX.Base.Commands as LaTeX

import Data.Monoid
import Data.Function ((&))

import CAS.Dumb.Tree

type LaTeXMath__MathLatin_RomanGreek__BopomofoGaps
   = CAS (Infix LaTeX) (Encapsulation LaTeX) (Symbol LaTeX)

infixl 1 >$
-- | Embed inline maths in a monadic chain of document-components. Space before
--   the math is included automatically.
--
-- @
--   do
--     \"If\">$𝑎;" and">$𝑏;" are the lengths of the legs and">$𝑐
--     " of the cathete of a right triangle, then">$ 𝑎◝2+𝑏◝2 ⩵ 𝑐◝2;" holds."
-- @
--
--   Note: these versions of the '$<>' and '>$' operators have a signature that's
--   monomorphic to unicode symbol-literals.
--   (This restriction is to avoid ambiguous types when writing maths /without/ any
--   symbols in it, like simply embedding a fraction in inline text.) See 
--   [Custom literals](#nonunicodeLiteralsHowto) if this is a problem for you.
(>$) :: LaTeXC r
        => r -> LaTeXMath__MathLatin_RomanGreek__BopomofoGaps -> r
(>$) = (Math.LaTeX.Internal.Display.>$)

infixr 6 $<>
-- | Embed inline maths in a semigroup/monoidal chain of document-components.
--
-- @
--     "If "<>𝑎$<>" and "<>𝑏$<>" are the lengths of the legs and "<>𝑐$<>
--      " of the cathete of a right triangle, then "<>(𝑎◝2+𝑏◝2 ⩵ 𝑐◝2)$<>" holds."
-- @
--
--   This will be rendered as: If \(a\) and \(b\) are the lengths of the legs and \(c\)
--   of the cathete of a right triangle, then \(a^2+b^2=c^2\) holds.
($<>) :: LaTeXC r
        => LaTeXMath__MathLatin_RomanGreek__BopomofoGaps -> r -> r
($<>) = (Math.LaTeX.Internal.Display.$<>)

-- $unicodeLiterals
-- This module offers a “WYSiWYG” style, with italic Unicode math symbols
-- (@U+1d44e 𝑎@ - @U+1d467 𝑧@) coming out as standard italic symbols \(a\) - \(z\),
-- bold Unicode math symbols (@U+1d41a 𝐚@ - @U+1d433 𝐳@) coming out as bold
-- \(\mathbf{a}\) - \(\mathbf{z}\) and so on.
-- Greek letters can be used from the standard block
-- (@U+3b1 α@ → \(\alpha\) - @U+3c9 ω@ → \(\omega\)).
-- All of this also works for uppercase letters (it circumvents Haskell syntax
-- restrictions by using the @PatternSynonyms@ extension).
-- 
-- Upright (roman) symbols are not directly supported, but if you import
-- "Math.LaTeX.StringLiterals" they can be written as strings.
-- 
-- Example: @𝑎 + 𝐛 + 𝐶 + \"D\" + ε + Φ ∈ ℝ@ is rendered as
-- \(a + \mathbf{b} + C + \text{D} + \varepsilon + \Phi \in \mathbb{R}\).
-- 
-- The Bopomofo symbols here are not exported for use in documents but
-- for [Algebraic manipulation](#algebraManip).

-- $nonunicodeLiterals
-- If you prefer using instead e.g. ASCII letters @A@ - @z@ for simple symbols
-- \(A\) - \(z\), use this import list:
--
-- @
-- import Math.LaTeX.Prelude hiding ((>$), (<>$))
-- import "Math.LaTeX.Internal.Display" ((>$), (<>$))
-- import "CAS.Dumb.Symbols.ASCII"
-- @
-- 
-- We give no guarantee that this will work without name clashes or type ambiguities.

prime :: LaTeXC l => l -> l
prime = (<>raw"'")

infix 2 |->
(|->) :: CAS' γ   s⁰ -> CAS' γ   s⁰ -> Equality' γ   s⁰
(|->) = (:=:)