module Agda.Utils.Char where
import Data.Char
decDigit :: Char -> Int
decDigit c = ord c - ord '0'
hexDigit :: Char -> Int
hexDigit c | isDigit c = decDigit c
| otherwise = ord (toLower c) - ord 'a' + 10
octDigit :: Char -> Int
octDigit = decDigit
data UnicodeTest
= IsControl | IsSpace
| IsLower | IsUpper | IsAlpha | IsAlphaNum | IsPrint
| IsDigit | IsOctDigit | IsHexDigit
| IsLetter | IsMark | IsNumber | IsPunctuation | IsSymbol | IsSeparator
deriving (Eq, Ord, Show)
unicodeTests :: [(UnicodeTest, Char -> Bool)]
unicodeTests =
[ (IsControl, isControl), (IsSpace, isSpace)
, (IsLower, isLower), (IsUpper, isUpper), (IsAlpha, isAlpha)
, (IsAlphaNum, isAlphaNum)
, (IsPrint, isPrint)
, (IsDigit, isDigit), (IsOctDigit, isOctDigit), (IsHexDigit, isHexDigit)
, (IsLetter, isLetter), (IsMark, isMark)
, (IsNumber, isNumber), (IsPunctuation, isPunctuation), (IsSymbol, isSymbol)
, (IsSeparator, isSeparator)
]
testChar :: Char -> [UnicodeTest]
testChar c = map fst $ filter (($ c) . snd) unicodeTests