module Unicode.Char.General
(
isLetter
, isSpace
, isJamo
, jamoNCount
, jamoLFirst
, jamoLIndex
, jamoLLast
, jamoVFirst
, jamoVCount
, jamoVIndex
, jamoVLast
, jamoTFirst
, jamoTCount
, jamoTIndex
, jamoTLast
, hangulFirst
, hangulLast
, isHangul
, isHangulLV
)
where
import Control.Exception (assert)
import Data.Char (ord)
import Unicode.Internal.Division (quotRem28)
import qualified Unicode.Internal.Char.DerivedCoreProperties as P
import qualified Unicode.Internal.Char.PropList as P
{-# INLINE isLetter #-}
isLetter :: Char -> Bool
isLetter :: Char -> Bool
isLetter = Char -> Bool
P.isAlphabetic
{-# INLINE isSpace #-}
isSpace :: Char -> Bool
isSpace :: Char -> Bool
isSpace = Char -> Bool
P.isWhite_Space
jamoLFirst, jamoLCount, jamoLLast :: Int
jamoLFirst :: Int
jamoLFirst = Int
0x1100
jamoLCount :: Int
jamoLCount = Int
19
jamoLLast :: Int
jamoLLast = Int
jamoLFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
jamoLCount Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
jamoVFirst, jamoVCount, jamoVLast :: Int
jamoVFirst :: Int
jamoVFirst = Int
0x1161
jamoVCount :: Int
jamoVCount = Int
21
jamoVLast :: Int
jamoVLast = Int
jamoVFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
jamoVCount Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
jamoTFirst, jamoTCount :: Int
jamoTFirst :: Int
jamoTFirst = Int
0x11a7
jamoTCount :: Int
jamoTCount = Int
28
jamoTLast :: Int
jamoTLast :: Int
jamoTLast = Int
jamoTFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
jamoTCount Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
jamoNCount :: Int
jamoNCount :: Int
jamoNCount = Int
588
hangulFirst, hangulLast :: Int
hangulFirst :: Int
hangulFirst = Int
0xac00
hangulLast :: Int
hangulLast = Int
hangulFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
jamoLCount Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
jamoVCount Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
jamoTCount Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
isHangul :: Char -> Bool
isHangul :: Char -> Bool
isHangul Char
c = Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
hangulFirst Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
hangulLast
where n :: Int
n = Char -> Int
ord Char
c
isHangulLV :: Char -> Bool
isHangulLV :: Char -> Bool
isHangulLV Char
c = Bool -> ((Int, Int) -> Int) -> (Int, Int) -> Int
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Int
jamoTCount Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
28)
(Int, Int) -> Int
forall a b. (a, b) -> b
snd (Int -> (Int, Int)
quotRem28 (Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
hangulFirst)) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
isJamo :: Char -> Bool
isJamo :: Char -> Bool
isJamo Char
c = Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
jamoLFirst Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
jamoTLast
where n :: Int
n = Char -> Int
ord Char
c
jamoLIndex :: Char -> Maybe Int
jamoLIndex :: Char -> Maybe Int
jamoLIndex Char
c
| Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
jamoLCount = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
index
| Bool
otherwise = Maybe Int
forall a. Maybe a
Nothing
where index :: Int
index = Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
jamoLFirst
jamoVIndex :: Char -> Maybe Int
jamoVIndex :: Char -> Maybe Int
jamoVIndex Char
c
| Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
jamoVCount = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
index
| Bool
otherwise = Maybe Int
forall a. Maybe a
Nothing
where index :: Int
index = Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
jamoVFirst
jamoTIndex :: Char -> Maybe Int
jamoTIndex :: Char -> Maybe Int
jamoTIndex Char
c
| Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
jamoTCount = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
index
| Bool
otherwise = Maybe Int
forall a. Maybe a
Nothing
where index :: Int
index = Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
jamoTFirst