{-# LANGUAGE BangPatterns #-}
module Data.Unicode.Properties.DecomposeHangul
(decomposeCharHangul
, hangulFirst
, isHangul
, isHangulLV
, isJamo
, jamoLFirst
, jamoLIndex
, jamoNCount
, jamoVIndex
, jamoTCount
, jamoTIndex
)
where
import Data.Char (ord)
import GHC.Base (unsafeChr)
jamoLFirst, jamoLCount :: Int
jamoLFirst :: Int
jamoLFirst = 0x1100
jamoLCount :: Int
jamoLCount = 19
jamoVFirst, jamoVCount :: Int
jamoVFirst :: Int
jamoVFirst = 0x1161
jamoVCount :: Int
jamoVCount = 21
jamoTFirst, jamoTCount :: Int
jamoTFirst :: Int
jamoTFirst = 0x11a7
jamoTCount :: Int
jamoTCount = 28
jamoLast :: Int
jamoLast :: Int
jamoLast = Int
jamoTFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
jamoTCount Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
jamoNCount :: Int
jamoNCount :: Int
jamoNCount = 588
hangulFirst, hangulLast :: Int
hangulFirst :: Int
hangulFirst = 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
- 1
isHangul :: Char -> Bool
isHangul :: Char -> Bool
isHangul c :: 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 c :: Char
c = Int
ti Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0
where
i :: Int
i = (Char -> Int
ord Char
c) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
hangulFirst
!(_, ti :: Int
ti) = Int
i Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
jamoTCount
isJamo :: Char -> Bool
isJamo :: Char -> Bool
isJamo c :: 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
jamoLast
where n :: Int
n = Char -> Int
ord Char
c
jamoLIndex :: Char -> Maybe Int
jamoLIndex :: Char -> Maybe Int
jamoLIndex c :: Char
c
| Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= 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 c :: Char
c
| Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= 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 c :: Char
c
| Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 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
{-# INLINE decomposeCharHangul #-}
decomposeCharHangul :: Char -> Either (Char, Char) (Char, Char, Char)
decomposeCharHangul :: Char -> Either (Char, Char) (Char, Char, Char)
decomposeCharHangul c :: Char
c
| Int
ti Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = (Char, Char) -> Either (Char, Char) (Char, Char, Char)
forall a b. a -> Either a b
Left (Char
l, Char
v)
| Bool
otherwise = (Char, Char, Char) -> Either (Char, Char) (Char, Char, Char)
forall a b. b -> Either a b
Right (Char
l, Char
v, Char
t)
where
i :: Int
i = (Char -> Int
ord Char
c) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
hangulFirst
!(tn :: Int
tn, ti :: Int
ti) = Int
i Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
jamoTCount
!(li :: Int
li, vi :: Int
vi) = Int
tn Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
jamoVCount
l :: Char
l = Int -> Char
unsafeChr (Int
jamoLFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
li)
v :: Char
v = Int -> Char
unsafeChr (Int
jamoVFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
vi)
t :: Char
t = Int -> Char
unsafeChr (Int
jamoTFirst Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
ti)