{-# LANGUAGE TemplateHaskell #-}
module Text.Collate.CanonicalCombiningClass
  ( canonicalCombiningClass )
where
import Text.Collate.UnicodeData (genCanonicalCombiningClassMap)
import qualified Data.IntMap as M
import Data.Maybe (fromMaybe)

-- | Map from code points to canonical combining classes.
-- Only nonzero elements are included.
combiningClassMap :: M.IntMap Int
combiningClassMap :: IntMap Int
combiningClassMap = $(Int
[(Int, Int)]
[(Int, Int)] -> IntMap Int
forall a. [(Int, a)] -> IntMap a
genCanonicalCombiningClassMap)

-- | Determine the canonical combining class for a code point.
canonicalCombiningClass :: Int -> Int
canonicalCombiningClass :: Int -> Int
canonicalCombiningClass Int
cp
  | Int
cp Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0x300 = Int
0  -- optimization
  | Bool
otherwise  = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (Maybe Int -> Int)
-> (IntMap Int -> Maybe Int) -> IntMap Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> IntMap Int -> Maybe Int
forall a. Int -> IntMap a -> Maybe a
M.lookup Int
cp (IntMap Int -> Int) -> IntMap Int -> Int
forall a b. (a -> b) -> a -> b
$! IntMap Int
combiningClassMap