{-# language OverloadedStrings #-}
import Data.Text hiding (concat)
import Data.Text.IO
import Prelude hiding (putStr)
flatten ls = [ (l, r) | (l, rs) <- ls, r <- rs ]
convLatex ls = [ (l, replace "\\" "«" r) | (l, r) <- ls ]
-- not used, doesn't work well in conjunction with lower
greekUpper = convLatex
[ ("Α", "\\Alpha")
, ("Β", "\\Beta")
, ("Γ", "\\Gamma")
, ("Δ", "\\Delta")
, ("Ε", "\\Epsilon")
, ("Ζ", "\\Zeta")
, ("Η", "\\Eta")
, ("Θ", "\\Theta")
, ("Ι", "\\Iota")
, ("Κ", "\\Kappa")
, ("Λ", "\\Lambda")
, ("Μ", "\\Mu")
, ("Ν", "\\Nu")
, ("Ξ", "\\Xi")
, ("Ο", "\\Omikron")
, ("Π", "\\Pi")
, ("Ρ", "\\Rho")
, ("Σ", "\\Sigma")
, ("Τ", "\\Tau")
, ("Υ", "\\Upsilon")
, ("Φ", "\\Phi")
, ("Χ", "\\Chi")
, ("Ψ", "\\Psi")
, ("Ω", "\\Omega")
]
greek = convLatex
[ ("α", "\\alpha")
, ("β", "\\beta")
, ("γ", "\\gamma")
, ("δ", "\\delta")
, ("ε", "\\epsilon")
, ("ζ", "\\zeta")
, ("η", "\\eta")
, ("θ", "\\theta")
, ("ι", "\\iota")
, ("κ", "\\kappa")
, ("λ", "\\lambda")
, ("μ", "\\mu")
, ("ν", "\\nu")
, ("ξ", "\\xi")
, ("ο", "\\omikron")
, ("π", "\\pi")
, ("ρ", "\\rho")
, ("σ", "\\sigma")
, ("τ", "\\tau")
, ("υ", "\\upsilon")
, ("φ", "\\phi")
, ("χ", "\\chi")
, ("ψ", "\\psi")
, ("ω", "\\omega")
]
logic = (convLatex . flatten)
[ ("∧", ["\\wedge", "\\and"])
, ("∨", ["\\vee", "\\vee"])
, ("¬", ["\\not", "\\neg"])
, ("⇔", ["\\iff"])
, ("⇒", ["\\implies"])
, ("⊤", ["\\top"])
, ("⊥", ["\\bottom", "\\perp"])
, ("∃", ["\\exists"])
, ("∀", ["\\forall"])
]
set = (convLatex . flatten)
[ ("∅", ["\\emptyset"])
, ("∪", ["\\union", "\\cup"])
, ("∩", ["\\intersection", "\\cap"])
, ("≠", ["\\neq"])
, ("⊂", ["\\subset"])
, ("⊆", ["\\subseteq"])
, ("⊊", ["\\subsetneq"])
, ("∊", ["\\in"])
, ("∉", ["\\notin"])
]
others = convLatex
[ ("≈", "\\iso")
, ("~", "\\sim")
, ("≤", "\\leq")
, ("≥", "\\geq")
, ("∞", "\\infty")
, ("→", "\\to")
, ("↦", "\\mapsto")
, ("↠", "\\epi")
, ("↪", "\\mono")
, ("∘", "\\circ")
, ("·", "\\cdot")
, ("×", "\\times")
, ("∑", "\\sum")
, ("∏", "\\prod")
, ("∐", "\\coprod")
, ("⊕", "\\oplus")
, ("⊗", "\\otimes")
]
mathbb = (convLatex . flatten)
[ ("𝔸", ["\\atoms", "\\AA"])
, ("ℕ", ["\\naturals", "\\NN"])
, ("ℚ", ["\\rationals", "\\QQ"])
, ("ℝ", ["\\reals", "\\RR"])
, ("ℤ", ["\\integers", "\\ZZ"])
]
allReplacements :: [(Text, Text)]
allReplacements = concat [greek, logic, set, others, mathbb]
header =
"\n\
\\n\
\\n\
\\n\
\"
footer =
"\n\
\\n\
\"
dict l r =
"\t\n\
\\t\tphrase\n\
\\t\t" <> l <> "\n\
\\t\tshortcut\n\
\\t\t" <> r <> "\n\
\\t\n\
\"
main = do
let allReplacements = (concat [greek, logic, set, others, mathbb]) :: [(Text, Text)]
putStr header
mapM (putStr . uncurry dict) allReplacements
putStr footer