{-# LANGUAGE BangPatterns #-}
module Data.Unicode.Properties.DecomposeHangul
(decomposeCharHangul
, hangulFirst
, hangulLast
, isHangul
, isHangulLV
, isJamo
, jamoLFirst
, jamoLIndex
, jamoLLast
, jamoVFirst
, jamoVIndex
, jamoVLast
, jamoTFirst
, jamoTCount
, jamoTIndex
, jamoLast
, jamoNCount
)
where
import Control.Exception (assert)
import Data.Char (ord)
import GHC.Base (unsafeChr)
import Data.Unicode.Internal.Division (quotRem21, quotRem28)
jamoLFirst, jamoLCount, jamoLLast :: Int
jamoLFirst :: Int
jamoLFirst = 0x1100
jamoLCount :: Int
jamoLCount = 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
- 1
jamoVFirst, jamoVCount, jamoVLast :: Int
jamoVFirst :: Int
jamoVFirst = 0x1161
jamoVCount :: Int
jamoVCount = 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
- 1
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 = 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
== 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
== 0
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 -> (Char, Char, Char)
decomposeCharHangul :: Char -> (Char, Char, Char)
decomposeCharHangul c :: Char
c = (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) = 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
== 28) Int -> (Int, Int)
quotRem28 Int
i
!(li :: Int
li, vi :: Int
vi) = Bool -> (Int -> (Int, Int)) -> Int -> (Int, Int)
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Int
jamoVCount Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 21) Int -> (Int, Int)
quotRem21 Int
tn
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)