module Data.Unicode.Properties.Decompose
( decomposeChar
, decomposeCharHangul
, DecomposeMode(..)
, DecomposeResult(..)
, isHangul
, jamoLFirst
, isDecomposable
)
where
import Data.BitArray (BitArray, lookupBit)
import Data.Char (ord)
import qualified Data.Unicode.Properties.Decomposable as D
import qualified Data.Unicode.Properties.DecomposableK as K
import Data.Unicode.Properties.DecomposeHangul ( decomposeCharHangul
, jamoLFirst
, isHangul)
import qualified Data.Unicode.Properties.Decompositions as D
import qualified Data.Unicode.Properties.DecompositionsK as K
data DecomposeMode = DecomposeNFD | DecomposeNFKD
{-# INLINE decomposeChar #-}
decomposeChar :: DecomposeMode -> Char -> [Char]
decomposeChar DecomposeNFD = D.decomposeChar
decomposeChar DecomposeNFKD = K.decomposeChar
{-# INLINE decomposeMin #-}
decomposeMin :: DecomposeMode -> Int
decomposeMin DecomposeNFD = D.decomposeMin
decomposeMin DecomposeNFKD = K.decomposeMin
{-# INLINE decomposeMax #-}
decomposeMax :: DecomposeMode -> Int
decomposeMax DecomposeNFD = D.decomposeMax
decomposeMax DecomposeNFKD = K.decomposeMax
{-# INLINE decomposeBitmap #-}
decomposeBitmap :: DecomposeMode -> BitArray
decomposeBitmap DecomposeNFD = D.decomposeBitmap
decomposeBitmap DecomposeNFKD = K.decomposeBitmap
data DecomposeResult = FalseA | FalseB | FalseC | TrueA
{-# INLINE isDecomposable #-}
isDecomposable :: DecomposeMode -> Char -> DecomposeResult
isDecomposable mode c | (ord c) < decomposeMin mode = FalseA
isDecomposable mode c | (ord c) <= decomposeMax mode =
case lookupBit (decomposeBitmap mode) (ord c) of
True -> TrueA
False -> FalseB
isDecomposable _ _ = FalseC