-- |
-- Module      : CAS.Dumb.Symbols.Unicode.MathLatin_RomanGreek.Qualified
-- Copyright   : (c) Justus Sagemüller 2017
-- License     : GPL v3
-- 
-- Maintainer  : (@) jsagemue $ uni-koeln.de
-- Stability   : experimental
-- Portability : portable
-- 
-- This module contains a collection of symbols that should be sufficient for usage
-- in most algebra applications. It is intended as alternative syntax for
-- "CAS.Dumb.Symbols.Unicode.MathLatin_RomanGreek__BopomofoGaps", the difference
-- being that the symbol names start with the qualifier @sym@. This means that
-- the uppercase symbols don't need special handling as @PatternSynonyms@.
-- 
-- @
-- 'sym𝑋' ≡ 'CAS.Dumb.Symbols.Unicode.MathLatin_RomanGreek__BopomofoGaps.𝑋'
-- @


{-# LANGUAGE PatternSynonyms       #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE UnicodeSyntax         #-}
{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE CPP                   #-}

module CAS.Dumb.Symbols.Unicode.MathLatin_RomanGreek.Qualified (
          module CAS.Dumb.Symbols
        , Symbol, Expression, Pattern
        -- * “Constant variable” symbols
        -- ** Lowercase letters
        -- $UnicodeMathSymHelp
        -- *** Italic Latin
        , sym𝑎,sym𝑏,sym𝑐,sym𝑑,sym𝑒,sym𝑓,sym𝑔,symℎ,sym𝑖,sym𝑗,sym𝑘,sym𝑙,sym𝑚,sym𝑛,sym𝑜,sym𝑝,sym𝑞,sym𝑟,sym𝑠,sym𝑡,sym𝑢,sym𝑣,sym𝑤,sym𝑥,sym𝑦,sym𝑧
        -- *** Bold
        , sym𝐚,sym𝐛,sym𝐜,sym𝐝,sym𝐞,sym𝐟,sym𝐠,sym𝐡,sym𝐢,sym𝐣,sym𝐤,sym𝐥,sym𝐦,sym𝐧,sym𝐨,sym𝐩,sym𝐪,sym𝐫,sym𝐬,sym𝐭,sym𝐮,sym𝐯,sym𝐰,sym𝐱,sym𝐲,sym𝐳
        -- *** Greek
        , symα,symβ,symγ,symδ,symε,symζ,symη,symθ,symϑ,symι,symκ,symλ,symμ,symν,symξ,symο,symπ,symρ,symϱ,symσ,symς,symτ,symυ,symϕ,symφ,symχ,symψ,symω
        -- ** Uppercase letters
        -- *** Italic
        ,sym𝐴,sym𝐵,sym𝐶,sym𝐷,sym𝐸,sym𝐹,sym𝐺,sym𝐻,sym𝐼,sym𝐽,sym𝐾,sym𝐿,sym𝑀,sym𝑁,sym𝑂,sym𝑃,sym𝑄,sym𝑅,sym𝑆,sym𝑇,sym𝑈,sym𝑉,sym𝑊,sym𝑋,sym𝑌,sym𝑍
        -- *** Bold
        ,sym𝐀,sym𝐁,sym𝐂,sym𝐃,sym𝐄,sym𝐅,sym𝐆,sym𝐇,sym𝐈,sym𝐉,sym𝐊,sym𝐋,sym𝐌,sym𝐍,sym𝐎,sym𝐏,sym𝐐,sym𝐑,sym𝐒,sym𝐓,sym𝐔,sym𝐕,sym𝐖,sym𝐗,sym𝐘,sym𝐙
        -- *** Blackboard (LaTeX subset)
        ,symℂ,symℍ,symℕ,symℚ,symℝ,symℤ
        -- *** Blackboard (nonstandard)
        ,sym𝔸,sym𝔹,sym𝔻,sym𝔼,sym𝔽,sym𝔾,sym𝕀,sym𝕁,sym𝕂,sym𝕃,sym𝕄,sym𝕆,sym𝕊,sym𝕋,sym𝕌,sym𝕍,sym𝕎,sym𝕏,sym𝕐
        -- *** Script
        ,sym𝒜,symℬ,sym𝒞,sym𝒟,symℰ,symℱ,sym𝒢,symℋ,symℐ,sym𝒥,sym𝒦,symℒ,symℳ,sym𝒩,sym𝒪,sym𝒫,sym𝒬,symℛ,sym𝒮,sym𝒯,sym𝒰,sym𝒱,sym𝒲,sym𝒳,sym𝒴,sym𝒵
        -- *** Calligraphic / bold-script
        ,sym𝓐,sym𝓑,sym𝓒,sym𝓓,sym𝓔,sym𝓕,sym𝓖,sym𝓗,sym𝓘,sym𝓙,sym𝓚,sym𝓛,sym𝓜,sym𝓝,sym𝓞,sym𝓟,sym𝓠,sym𝓡,sym𝓢,sym𝓣,sym𝓤,sym𝓥,sym𝓦,sym𝓧,sym𝓨,sym𝓩
        -- *** Fraktur
        ,sym𝔄,sym𝔅,symℭ,sym𝔇,sym𝔈,sym𝔉,sym𝔊,symℌ,symℑ,sym𝔍,sym𝔎,sym𝔏,sym𝔐,sym𝔑,sym𝔒,sym𝔓,sym𝔔,symℜ,sym𝔖,sym𝔗,sym𝔘,sym𝔙,sym𝔚,sym𝔛,sym𝔜
        -- *** Greek (LaTeX subset)
        -- $greekUppercaseLaTeXInfo
        ,symΓ,symΔ,symΘ,symΛ,symΞ,symΠ,symΣ,symΥ,symΦ,symΨ,symΩ
        -- *** Greek (Latin-lookalike)
        ,symΑ,symΒ,symΕ,symΖ,symΗ,symΙ,symΚ,symΜ,symΝ,symΟ,symΡ,symΤ,symΧ
        -- * Auxiliary
        , Expression'
        ) where

import CAS.Dumb.Tree
import CAS.Dumb.Symbols hiding ((&~~!), (&~~:), continueExpr)

import CAS.Dumb.Symbols.PatternGenerator
import CAS.Dumb.Symbols.Unicode.MathLatin_RomanGreek__BopomofoGaps
            ( Symbol, Expression', Expression, Pattern )

import Data.Void
import Control.Arrow


-- $UnicodeMathSymHelp
-- Unicode mathematical italic letters. Italic is the default way maths symbols appear in
-- e.g. LaTeX-rendered documents, thus it makes sense to use them here.
makeQualifiedSymbols ''Expression' "sym" "𝑎𝑏𝑐𝑑𝑒𝑓𝑔ℎ𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧"

makeQualifiedSymbols ''Expression' "sym" ['𝐚'..'𝐳']

makeQualifiedSymbols ''Expression' "sym" "αβγδεζηθϑικλμνξοπρϱσςτυϕφχψω"


makeQualifiedSymbols ''Expression' "sym" ['𝐴'..'𝑍']

makeQualifiedSymbols ''Expression' "sym" ['𝐀'..'𝐙']

makeQualifiedSymbols ''Expression' "sym" "𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ"

makeQualifiedSymbols ''Expression' "sym" "𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵"

makeQualifiedSymbols ''Expression' "sym" ['𝓐'..'𝓩']

makeQualifiedSymbols ''Expression' "sym" "𝔄𝔅ℭ𝔇𝔈𝔉𝔊ℌℑ𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔ℜ𝔖𝔗𝔘𝔙𝔚𝔛𝔜"

-- $greekUppercaseLaTeXInfo
-- These are the uppercase greek letters that don't have latin lookalikes. Only these
-- are supported in LaTeX, so for doing maths it's probably best to stick to this subset.

makeQualifiedSymbols ''Expression' "sym" $ ['Α'..'Ρ']++['Σ'..'Ω']