packages feed

unicode-data-0.5.0: lib/Unicode/Internal/Char/UnicodeData/Decomposable.hs

-- autogenerated from https://www.unicode.org/Public/15.0.0/ucd/UnicodeData.txt
-- |
-- Module      : Unicode.Internal.Char.UnicodeData.Decomposable
-- Copyright   : (c) 2020 Composewell Technologies and Contributors
-- License     : Apache-2.0
-- Maintainer  : streamly@composewell.com
-- Stability   : experimental

{-# OPTIONS_HADDOCK hide #-}

module Unicode.Internal.Char.UnicodeData.Decomposable
(isDecomposable)
where

import Data.Bits (Bits(..))
import Data.Char (ord)
import Data.Int (Int8)
import Data.Word (Word16, Word8)
import GHC.Exts (Ptr(..))
import Unicode.Internal.Bits (lookupBit, lookupWord16AsInt, lookupWord8AsInt)

{-# INLINE isDecomposable #-}
isDecomposable :: Char -> Bool
isDecomposable c = c >= '\x00C0' && c <= '\x2FA1D' && lookupIsDecomposableBitMap (ord c)

{-# INLINE lookupIsDecomposableBitMap #-}
lookupIsDecomposableBitMap :: Int -> Bool
lookupIsDecomposableBitMap n =
    lookupBit data# (
        lookupWord16AsInt offsets1# (
            lookupWord8AsInt offsets2# (
                n `shiftR` 12
            ) + ((n `shiftR` 9) .&. maskOffsets)
        ) + ((n `shiftR` 3) .&. maskData)
    ) (n .&. 7)
    where
    maskData = (1 `shiftL` 6) - 1
    maskOffsets = (1 `shiftL` 3) - 1
    !(Ptr data#) = isDecomposableDataBitMap
    !(Ptr offsets1#) = isDecomposableOffsets1BitMap
    !(Ptr offsets2#) = isDecomposableOffsets2BitMap

isDecomposableDataBitMap :: Ptr Int8
isDecomposableDataBitMap = Ptr
    "\16\18\0\0\80\0\0\0\146\2\0\0\5\224\51\3\51\3\0\0\0\240\0\0\0\0\0\0\15\60\0\0\0\0\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\88\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\20\0\8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\192\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\129\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\28\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\116\0\0\0\0\255\63\229\127\101\252\255\255\
    \\255\255\255\255\255\63\255\255\255\255\255\255\255\255\255\255\255\255\255\3\0\0\0\0\0\0\0\160\0\252\127\95\219\127\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\20\0\8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\192\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\88\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\64\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\192\31\0\0\0\0\0\0\0\0\0\0\248\1\0\0\0\0\0\0\0\0\0\0\0\64\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\8\32\132\16\0\2\104\1\2\0\8\32\132\16\0\
    \\2\0\0\0\0\0\0\0\0\0\0\0\0\124\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\18\0\0\0\0\255\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\176\0\0\0\0\
    \\139\112\0\2\0\0\0\2\0\0\139\112\0\0\192\0\0\0\0\0\0\0\0\0\6\0\207\252\252\252\63\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\64\85\4\0\0\0\0\40\11\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\191\255\126\62\191\255\126\190\255\255\252\255\63\255\241\126\248\241\243\255\63\255\255\127\0\0\0\0\3\128\1\0\0\224\255\223\207\255\
    \\49\255\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\64\12\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\12\0\64\0\0\0\224\0\0\0\0\0\0\0\0\0\80\85\85\165\2\219\54\0\0\16\64\0\80\85\85\165\2\219\54\0\0\144\71\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\11\255\255\255\255\255\255\255\255\255\255\255\
    \\3\255\255\63\63\255\255\255\255\63\63\255\170\255\255\255\63\255\255\255\255\255\255\223\95\222\255\207\239\255\255\220\63\255\63\229\127\101\252\255\255\255\255\255\255\255\63\255\255\255\
    \\255\255\255\255\255\255\255\255\255\255\3\0\0\0\0\0\0\0\160\0\252\127\95\219\127\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
    \\0\0\0\0\0\0\0\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\207\192\255\15\0\0\0\0\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\27\0\0\0\0\0\16\64\224\215\1\0\0\252\1\0\0\124\24\0\0\
    \\0\0\0\0\72\0\0\0\0\78\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\0\48\0\0\0\0\0\0\16\0\
    \\0\0\0\0\0\28\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\18\0\0\0\0\255\
    \\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\176\0\0\0\0"#

isDecomposableOffsets1BitMap :: Ptr Word16
isDecomposableOffsets1BitMap = Ptr
    "\242\3\230\1\230\1\230\1\230\1\230\1\230\1\230\1\230\1\18\4\36\1\230\1\230\1\251\1\230\1\230\1\230\1\230\1\230\1\230\1\230\1\50\4\46\1\135\0\173\0\79\0\230\1\38\0\230\1\230\1\230\1\230\1\18\4\36\1\230\1\230\1\120\3\9\5\238\2\147\2\174\2\68\5\228\0\83\2\225\1\230\1\230\1\230\1\230\1\79\3\
    \\230\1\95\4\184\3\0\0\230\1\230\1\230\1\19\3\230\1\230\1"#

isDecomposableOffsets2BitMap :: Ptr Word8
isDecomposableOffsets2BitMap = Ptr
    "\36\44\52\0\1\1\1\1\1\1\1\1\1\1\1\5\1\23\1\1\1\1\1\1\1\1\1\1\1\13\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\17"#