packages feed

alms-0.6.0: src/Syntax/Strings.hs

-- | Hard-coded strings that depend on whether we're doing unicode.
module Syntax.Strings where

{-# INLINE digits #-}
-- | Subscript numerals for type variables
digits ∷ [Char]

{-# INLINE tvNames #-}
-- | Names to give to type variables
tvNames ∷ [Char]

{-# INLINE fun #-}
{-# INLINE arrow #-}
-- | Term keywords
fun, arrow ∷ String

{-# INLINE all #-}
{-# INLINE ex #-}
{-# INLINE mu #-}
-- | Quantifiers
all, ex, mu ∷ String

{-# INLINE cons #-}
{-# INLINE product #-}
{-# INLINE uArrow #-}
{-# INLINE aArrow #-}
{-# INLINE arrowPre #-}
{-# INLINE arrowPost #-}
{-# INLINE join #-}
-- | Infix type constructors
cons, product, uArrow, aArrow, arrowPre, arrowPost, join ∷ String

{-# INLINE affine #-}
{-# INLINE unlimited #-}
{-# INLINE covariant #-}
{-# INLINE contravariant #-}
{-# INLINE invariant #-}
{-# INLINE omnivariant #-}
{-# INLINE qcovariant #-}
{-# INLINE qcontravariant #-}
{-# INLINE qinvariant #-}
-- | Sigils
affine, unlimited,
  covariant, contravariant, invariant, omnivariant,
  qcovariant, qcontravariant, qinvariant ∷ String

{-# INLINE ellipsis #-}
ellipsis ∷ String

#ifdef UNICODE
digits = unicodeDigits
tvNames         = [ 'a' .. 'z' ]
all             = "∀"
ex              = "∃"
mu              = "μ"
cons            = "∷"
product         = "×"
uArrow          = "→"
aArrow          = "-A>"
arrowPre        = "-"
arrowPost       = ">"
join            = "⋁"
affine          = "`"
unlimited       = "\'"
covariant       = "+"
contravariant   = "-"
invariant       = ""
omnivariant     = "0"
qcovariant      = "Q+"
qcontravariant  = "Q-"
qinvariant      = "Q"
ellipsis        = "..."
fun             = "λ"
arrow           = "→"
#else
digits = asciiDigits
tvNames         = [ 'a' .. 'z' ]
all             = "all"
ex              = "ex"
mu              = "mu"
cons            = "::"
product         = "*"
uArrow          = "->"
aArrow          = "-A>"
arrowPre        = "-"
arrowPost       = ">"
join            = "\\/"
affine          = "`"
unlimited       = "\'"
covariant       = "+"
contravariant   = "-"
invariant       = ""
omnivariant     = "0"
qcovariant      = "Q+"
qcontravariant  = "Q-"
qinvariant      = "Q"
ellipsis        = "..."
fun             = "fun"
arrow           = "->"
#endif

{-# INLINE unicodeDigits #-}
{-# INLINE asciiDigits #-}
unicodeDigits, asciiDigits ∷ [Char]
unicodeDigits = "₀₁₂₃₄₅₆₇₈₉"
asciiDigits   = "0123456789"

normalizeChar ∷ Char → Char
normalizeChar '₀' = '0'
normalizeChar '₁' = '1'
normalizeChar '₂' = '2'
normalizeChar '₃' = '3'
normalizeChar '₄' = '4'
normalizeChar '₅' = '5'
normalizeChar '₆' = '6'
normalizeChar '₇' = '7'
normalizeChar '₈' = '8'
normalizeChar '₉' = '9'
normalizeChar '′' = '\''
normalizeChar 'α' = 'a'
normalizeChar 'β' = 'b'
normalizeChar 'ψ' = 'c'
normalizeChar 'δ' = 'd'
normalizeChar 'ε' = 'e'
normalizeChar 'φ' = 'f'
normalizeChar 'γ' = 'g'
normalizeChar 'η' = 'h'
normalizeChar 'ι' = 'i'
normalizeChar 'ξ' = 'j'
normalizeChar 'κ' = 'k'
normalizeChar 'λ' = 'l'
normalizeChar 'μ' = 'm'
normalizeChar 'ν' = 'n'
normalizeChar 'ο' = 'o'
normalizeChar 'π' = 'p'
normalizeChar 'ρ' = 'r'
normalizeChar 'σ' = 's'
normalizeChar 'τ' = 't'
normalizeChar 'θ' = 'u'
normalizeChar 'ω' = 'v'
normalizeChar 'ς' = 'w'
normalizeChar 'χ' = 'x'
normalizeChar 'υ' = 'y'
normalizeChar 'ζ' = 'z'
normalizeChar c   = c