    -- |
    -- Module      : Unicode.Char.Numeric.Compat
    -- Copyright   : (c) 2020 Composewell Technologies and Contributors
    -- License     : Apache-2.0
    -- Maintainer  : streamly@composewell.com
    -- Stability   : experimental
    --
    -- Compatibility module for numeric character property related functions.
    --
    -- @since 0.3.1
    --
    module Unicode.Char.Numeric.Compat
        ( -- * Predicates
          isNumber
        ) where

    import Data.Char (ord)
    import qualified Unicode.Internal.Char.UnicodeData.GeneralCategory as UC

    -- | Selects Unicode numeric characters, including digits from various
    -- scripts, Roman numerals, et cetera.
    --
    -- This function returns 'True' if its argument has one of the
    -- following 'Unicode.Char.General.GeneralCategory's, or 'False' otherwise:
    --
    -- * 'Unicode.Char.General.DecimalNumber'
    -- * 'Unicode.Char.General.LetterNumber'
    -- * 'Unicode.Char.General.OtherNumber'
    --
    -- __Note:__ a character may have a numeric value (see
    -- 'Unicode.Char.Numeric.numericValue') but return 'False', because 'isNumber'
    -- only tests 'Unicode.Char.General.GeneralCategory': some CJK characters are
    -- 'Unicode.Char.General.OtherLetter' and do have a numeric value.
    -- Use 'Unicode.Char.Numeric.isNumeric' to cover those cases as well.
    --
    -- prop> isNumber c == Data.Char.isNumber c
    --
    -- @since 0.3.1 moved to Compat module.
    --
    -- @since 0.3.0
    isNumber :: Char -> Bool
    isNumber :: Char -> Bool
    isNumber Char
    c =
        -- NOTE: The guard constant is updated at each Unicode revision.
        --       It must be < 0x40000 to be accepted by generalCategoryPlanes0To3.
        Int
    cp Int -> Int -> Bool
    forall a. Ord a => a -> a -> Bool
    <= Int
    UC.MaxIsNumber Bool -> Bool -> Bool
    &&
        case Int -> Int
    UC.generalCategoryPlanes0To3 Int
    cp of
            Int
    UC.DecimalNumber -> Bool
    True
            Int
    UC.LetterNumber  -> Bool
    True
            Int
    UC.OtherNumber   -> Bool
    True
            Int
    _                -> Bool
    False
        where !cp :: Int
    cp = Char -> Int
    ord Char
    c