{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE Trustworthy #-}
{-# OPTIONS_HADDOCK not-home #-}
module GHC.Internal.Unicode (
        unicodeVersion,
        GeneralCategory (..), generalCategory,
        isAscii, isLatin1, isControl,
        isAsciiUpper, isAsciiLower,
        isPrint, isSpace, isUpper, isUpperCase,
        isLower, isLowerCase, isAlpha, isDigit,
        isOctDigit, isHexDigit, isAlphaNum,
        isPunctuation, isSymbol,
        toUpper, toLower, toTitle
    ) where
import GHC.Internal.Base
import GHC.Internal.Real
import GHC.Internal.Enum ( Enum (..), Bounded (..) )
import GHC.Internal.Ix ( Ix (..) )
import GHC.Internal.Num
import GHC.Internal.Unicode.Version
import qualified GHC.Internal.Unicode.Char.DerivedCoreProperties as DCP
import qualified GHC.Internal.Unicode.Char.UnicodeData.GeneralCategory as GC
import qualified GHC.Internal.Unicode.Char.UnicodeData.SimpleLowerCaseMapping as C
import qualified GHC.Internal.Unicode.Char.UnicodeData.SimpleTitleCaseMapping as C
import qualified GHC.Internal.Unicode.Char.UnicodeData.SimpleUpperCaseMapping as C
import GHC.Internal.Show ( Show )
data GeneralCategory
        = UppercaseLetter       
        | LowercaseLetter       
        | TitlecaseLetter       
        | ModifierLetter        
        | OtherLetter           
        | NonSpacingMark        
        | SpacingCombiningMark  
        | EnclosingMark         
        | DecimalNumber         
        | LetterNumber          
        | OtherNumber           
        | ConnectorPunctuation  
        | DashPunctuation       
        | OpenPunctuation       
        | ClosePunctuation      
        | InitialQuote          
        | FinalQuote            
        | OtherPunctuation      
        | MathSymbol            
        | CurrencySymbol        
        | ModifierSymbol        
        | OtherSymbol           
        | Space                 
        | LineSeparator         
        | ParagraphSeparator    
        | Control               
        | Format                
        | Surrogate             
        | PrivateUse            
        | NotAssigned           
        deriving ( Int -> GeneralCategory -> ShowS
[GeneralCategory] -> ShowS
GeneralCategory -> String
(Int -> GeneralCategory -> ShowS)
-> (GeneralCategory -> String)
-> ([GeneralCategory] -> ShowS)
-> Show GeneralCategory
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GeneralCategory -> ShowS
showsPrec :: Int -> GeneralCategory -> ShowS
$cshow :: GeneralCategory -> String
show :: GeneralCategory -> String
$cshowList :: [GeneralCategory] -> ShowS
showList :: [GeneralCategory] -> ShowS
Show     
                 , GeneralCategory -> GeneralCategory -> Bool
(GeneralCategory -> GeneralCategory -> Bool)
-> (GeneralCategory -> GeneralCategory -> Bool)
-> Eq GeneralCategory
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GeneralCategory -> GeneralCategory -> Bool
== :: GeneralCategory -> GeneralCategory -> Bool
$c/= :: GeneralCategory -> GeneralCategory -> Bool
/= :: GeneralCategory -> GeneralCategory -> Bool
Eq       
                 , Eq GeneralCategory
Eq GeneralCategory =>
(GeneralCategory -> GeneralCategory -> Ordering)
-> (GeneralCategory -> GeneralCategory -> Bool)
-> (GeneralCategory -> GeneralCategory -> Bool)
-> (GeneralCategory -> GeneralCategory -> Bool)
-> (GeneralCategory -> GeneralCategory -> Bool)
-> (GeneralCategory -> GeneralCategory -> GeneralCategory)
-> (GeneralCategory -> GeneralCategory -> GeneralCategory)
-> Ord GeneralCategory
GeneralCategory -> GeneralCategory -> Bool
GeneralCategory -> GeneralCategory -> Ordering
GeneralCategory -> GeneralCategory -> GeneralCategory
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: GeneralCategory -> GeneralCategory -> Ordering
compare :: GeneralCategory -> GeneralCategory -> Ordering
$c< :: GeneralCategory -> GeneralCategory -> Bool
< :: GeneralCategory -> GeneralCategory -> Bool
$c<= :: GeneralCategory -> GeneralCategory -> Bool
<= :: GeneralCategory -> GeneralCategory -> Bool
$c> :: GeneralCategory -> GeneralCategory -> Bool
> :: GeneralCategory -> GeneralCategory -> Bool
$c>= :: GeneralCategory -> GeneralCategory -> Bool
>= :: GeneralCategory -> GeneralCategory -> Bool
$cmax :: GeneralCategory -> GeneralCategory -> GeneralCategory
max :: GeneralCategory -> GeneralCategory -> GeneralCategory
$cmin :: GeneralCategory -> GeneralCategory -> GeneralCategory
min :: GeneralCategory -> GeneralCategory -> GeneralCategory
Ord      
                 , Int -> GeneralCategory
GeneralCategory -> Int
GeneralCategory -> [GeneralCategory]
GeneralCategory -> GeneralCategory
GeneralCategory -> GeneralCategory -> [GeneralCategory]
GeneralCategory
-> GeneralCategory -> GeneralCategory -> [GeneralCategory]
(GeneralCategory -> GeneralCategory)
-> (GeneralCategory -> GeneralCategory)
-> (Int -> GeneralCategory)
-> (GeneralCategory -> Int)
-> (GeneralCategory -> [GeneralCategory])
-> (GeneralCategory -> GeneralCategory -> [GeneralCategory])
-> (GeneralCategory -> GeneralCategory -> [GeneralCategory])
-> (GeneralCategory
    -> GeneralCategory -> GeneralCategory -> [GeneralCategory])
-> Enum GeneralCategory
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: GeneralCategory -> GeneralCategory
succ :: GeneralCategory -> GeneralCategory
$cpred :: GeneralCategory -> GeneralCategory
pred :: GeneralCategory -> GeneralCategory
$ctoEnum :: Int -> GeneralCategory
toEnum :: Int -> GeneralCategory
$cfromEnum :: GeneralCategory -> Int
fromEnum :: GeneralCategory -> Int
$cenumFrom :: GeneralCategory -> [GeneralCategory]
enumFrom :: GeneralCategory -> [GeneralCategory]
$cenumFromThen :: GeneralCategory -> GeneralCategory -> [GeneralCategory]
enumFromThen :: GeneralCategory -> GeneralCategory -> [GeneralCategory]
$cenumFromTo :: GeneralCategory -> GeneralCategory -> [GeneralCategory]
enumFromTo :: GeneralCategory -> GeneralCategory -> [GeneralCategory]
$cenumFromThenTo :: GeneralCategory
-> GeneralCategory -> GeneralCategory -> [GeneralCategory]
enumFromThenTo :: GeneralCategory
-> GeneralCategory -> GeneralCategory -> [GeneralCategory]
Enum     
                 , GeneralCategory
GeneralCategory -> GeneralCategory -> Bounded GeneralCategory
forall a. a -> a -> Bounded a
$cminBound :: GeneralCategory
minBound :: GeneralCategory
$cmaxBound :: GeneralCategory
maxBound :: GeneralCategory
Bounded  
                 , Ord GeneralCategory
Ord GeneralCategory =>
((GeneralCategory, GeneralCategory) -> [GeneralCategory])
-> ((GeneralCategory, GeneralCategory) -> GeneralCategory -> Int)
-> ((GeneralCategory, GeneralCategory) -> GeneralCategory -> Int)
-> ((GeneralCategory, GeneralCategory) -> GeneralCategory -> Bool)
-> ((GeneralCategory, GeneralCategory) -> Int)
-> ((GeneralCategory, GeneralCategory) -> Int)
-> Ix GeneralCategory
(GeneralCategory, GeneralCategory) -> Int
(GeneralCategory, GeneralCategory) -> [GeneralCategory]
(GeneralCategory, GeneralCategory) -> GeneralCategory -> Bool
(GeneralCategory, GeneralCategory) -> GeneralCategory -> Int
forall a.
Ord a =>
((a, a) -> [a])
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Bool)
-> ((a, a) -> Int)
-> ((a, a) -> Int)
-> Ix a
$crange :: (GeneralCategory, GeneralCategory) -> [GeneralCategory]
range :: (GeneralCategory, GeneralCategory) -> [GeneralCategory]
$cindex :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Int
index :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Int
$cunsafeIndex :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Int
unsafeIndex :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Int
$cinRange :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Bool
inRange :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Bool
$crangeSize :: (GeneralCategory, GeneralCategory) -> Int
rangeSize :: (GeneralCategory, GeneralCategory) -> Int
$cunsafeRangeSize :: (GeneralCategory, GeneralCategory) -> Int
unsafeRangeSize :: (GeneralCategory, GeneralCategory) -> Int
Ix       
                 )
{-# INLINE generalCategory #-}
generalCategory :: Char -> GeneralCategory
generalCategory :: Char -> GeneralCategory
generalCategory = Int -> GeneralCategory
forall a. Enum a => Int -> a
toEnum (Int -> GeneralCategory)
-> (Char -> Int) -> Char -> GeneralCategory
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
GC.generalCategory
isAscii                 :: Char -> Bool
isAscii :: Char -> Bool
isAscii Char
c               =  Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<  Char
'\x80'
isLatin1                :: Char -> Bool
isLatin1 :: Char -> Bool
isLatin1 Char
c              =  Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\xff'
isAsciiLower :: Char -> Bool
isAsciiLower :: Char -> Bool
isAsciiLower Char
c          =  Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'a' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'z'
isAsciiUpper :: Char -> Bool
isAsciiUpper :: Char -> Bool
isAsciiUpper Char
c          =  Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'A' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'Z'
isControl               :: Char -> Bool
isControl :: Char -> Bool
isControl Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
Control -> Bool
True
        GeneralCategory
_       -> Bool
False
isPrint                 :: Char -> Bool
isPrint :: Char -> Bool
isPrint Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
LineSeparator      -> Bool
False
        GeneralCategory
ParagraphSeparator -> Bool
False
        GeneralCategory
Control            -> Bool
False
        GeneralCategory
Format             -> Bool
False
        GeneralCategory
Surrogate          -> Bool
False
        GeneralCategory
PrivateUse         -> Bool
False
        GeneralCategory
NotAssigned        -> Bool
False
        GeneralCategory
_                  -> Bool
True
isSpace                 :: Char -> Bool
isSpace :: Char -> Bool
isSpace Char
c
  | Word
uc Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
0x377 = Word
uc Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
32 Bool -> Bool -> Bool
|| Word
uc Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
0x9 Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
4 Bool -> Bool -> Bool
|| Word
uc Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0xa0
  | Bool
otherwise = Char -> GeneralCategory
generalCategory Char
c GeneralCategory -> GeneralCategory -> Bool
forall a. Eq a => a -> a -> Bool
== GeneralCategory
Space
  where
    uc :: Word
uc = Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
c) :: Word
isUpper                 :: Char -> Bool
isUpper :: Char -> Bool
isUpper Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
UppercaseLetter -> Bool
True
        GeneralCategory
TitlecaseLetter -> Bool
True
        GeneralCategory
_               -> Bool
False
{-# INLINE isUpperCase #-}
isUpperCase             :: Char -> Bool
isUpperCase :: Char -> Bool
isUpperCase = Char -> Bool
DCP.isUppercase
isLower                 :: Char -> Bool
isLower :: Char -> Bool
isLower Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
LowercaseLetter -> Bool
True
        GeneralCategory
_               -> Bool
False
{-# INLINE isLowerCase #-}
isLowerCase             :: Char -> Bool
isLowerCase :: Char -> Bool
isLowerCase = Char -> Bool
DCP.isLowercase
isAlpha                 :: Char -> Bool
isAlpha :: Char -> Bool
isAlpha Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
UppercaseLetter -> Bool
True
        GeneralCategory
LowercaseLetter -> Bool
True
        GeneralCategory
TitlecaseLetter -> Bool
True
        GeneralCategory
ModifierLetter  -> Bool
True
        GeneralCategory
OtherLetter     -> Bool
True
        GeneralCategory
_               -> Bool
False
isAlphaNum              :: Char -> Bool
isAlphaNum :: Char -> Bool
isAlphaNum Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
UppercaseLetter -> Bool
True
        GeneralCategory
LowercaseLetter -> Bool
True
        GeneralCategory
TitlecaseLetter -> Bool
True
        GeneralCategory
ModifierLetter  -> Bool
True
        GeneralCategory
OtherLetter     -> Bool
True
        GeneralCategory
DecimalNumber   -> Bool
True
        GeneralCategory
LetterNumber    -> Bool
True
        GeneralCategory
OtherNumber     -> Bool
True
        GeneralCategory
_               -> Bool
False
isDigit                 :: Char -> Bool
isDigit :: Char -> Bool
isDigit Char
c               =  (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'0') :: Word) Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
9
isOctDigit              :: Char -> Bool
isOctDigit :: Char -> Bool
isOctDigit Char
c            =  (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'0') :: Word) Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
7
isHexDigit              :: Char -> Bool
isHexDigit :: Char -> Bool
isHexDigit Char
c            =  Char -> Bool
isDigit Char
c Bool -> Bool -> Bool
||
                           (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'A')::Word) Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
5 Bool -> Bool -> Bool
||
                           (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
ord Char
'a')::Word) Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
<= Word
5
isPunctuation :: Char -> Bool
isPunctuation :: Char -> Bool
isPunctuation Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
ConnectorPunctuation    -> Bool
True
        GeneralCategory
DashPunctuation         -> Bool
True
        GeneralCategory
OpenPunctuation         -> Bool
True
        GeneralCategory
ClosePunctuation        -> Bool
True
        GeneralCategory
InitialQuote            -> Bool
True
        GeneralCategory
FinalQuote              -> Bool
True
        GeneralCategory
OtherPunctuation        -> Bool
True
        GeneralCategory
_                       -> Bool
False
isSymbol :: Char -> Bool
isSymbol :: Char -> Bool
isSymbol Char
c = case Char -> GeneralCategory
generalCategory Char
c of
        GeneralCategory
MathSymbol              -> Bool
True
        GeneralCategory
CurrencySymbol          -> Bool
True
        GeneralCategory
ModifierSymbol          -> Bool
True
        GeneralCategory
OtherSymbol             -> Bool
True
        GeneralCategory
_                       -> Bool
False
{-# INLINE toUpper #-}
toUpper                 :: Char -> Char
toUpper :: Char -> Char
toUpper = Char -> Char
C.toSimpleUpperCase
{-# INLINE toLower #-}
toLower                 :: Char -> Char
toLower :: Char -> Char
toLower = Char -> Char
C.toSimpleLowerCase
{-# INLINE toTitle #-}
toTitle                 :: Char -> Char
toTitle :: Char -> Char
toTitle = Char -> Char
C.toSimpleTitleCase