-- | Word16 module to be used with ByteString/ShortByteString.
-- All functions assumes that 'Word16' is encoded in BE.
module Data.Word16 (
  -- * Re-exporting
    Word16
  -- * conversion
  , word16ToChar
  , charToWord16
  -- * Character classification
  , isControl, isSpace, isLower, isUpper
  , isAlpha, isAlphaNum, isPrint, isDigit, isOctDigit, isHexDigit
  , isLetter, isMark, isNumber, isPunctuation, isSymbol, isSeparator
  -- * Subranges
  , isAscii, isLatin1, isAsciiUpper, isAsciiLower
  -- * Case conversion
  , toUpper, toLower, toTitle
  -- * ASCII characters
  , _nul, _tab, _lf, _vt, _np, _cr
  , _space, _exclam, _quotedbl, _numbersign, _dollar, _percent, _ampersand, _quotesingle, _parenleft, _parenright, _asterisk, _plus, _comma, _hyphen, _period, _slash
  , _0, _1, _2, _3, _4, _5, _6, _7, _8, _9
  , _colon, _semicolon, _less, _equal, _greater, _question, _at
  , _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z
  , _bracketleft, _backslash, _bracketright, _circum, _underscore, _grave
  , _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z
  , _braceleft, _bar, _braceright, _tilde, _del
  -- * Some Latin-1 characters
  , _nbsp
  , _ordfeminine, _softhyphen, _mu, _ordmasculine
  , _s2, _s3, _s1, _1'4, _1'2, _3'4
  , _Agrave, _Odieresis, _Oslash, _Thorn
  , _germandbls, _agrave, _odieresis, _oslash, _thorn, _ydieresis
  ) where

import qualified Data.Char as C
import Data.Word
    ( Word16 )


----------------------------------------------------------------

-- | Total conversion to char.
word16ToChar :: Word16 -> Char
word16ToChar :: Word16 -> Char
word16ToChar = Int -> Char
C.chr (Int -> Char) -> (Word16 -> Int) -> Word16 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral

-- | This is unsafe and clamps at Word16 maxbound.
charToWord16 :: Char -> Word16
charToWord16 :: Char -> Word16
charToWord16 = Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word16) -> (Char -> Int) -> Char -> Word16
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
C.ord

----------------------------------------------------------------

isControl :: Word16 -> Bool
isControl :: Word16 -> Bool
isControl Word16
w = Word16
_nul Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
0x1f
           Bool -> Bool -> Bool
|| Word16
_del Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
0x9f

isSpace :: Word16 -> Bool
isSpace :: Word16 -> Bool
isSpace = Char -> Bool
C.isSpace (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isLower :: Word16 -> Bool
isLower :: Word16 -> Bool
isLower = Char -> Bool
C.isLower (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isUpper :: Word16 -> Bool
isUpper :: Word16 -> Bool
isUpper = Char -> Bool
C.isUpper (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isAlpha :: Word16 -> Bool
isAlpha :: Word16 -> Bool
isAlpha = Char -> Bool
C.isAlpha (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isAlphaNum :: Word16 -> Bool
isAlphaNum :: Word16 -> Bool
isAlphaNum = Char -> Bool
C.isAlphaNum (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isPrint :: Word16 -> Bool
isPrint :: Word16 -> Bool
isPrint = Char -> Bool
C.isPrint (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isDigit :: Word16 -> Bool
isDigit :: Word16 -> Bool
isDigit Word16
w = Word16
_0 Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
_9

isOctDigit :: Word16 -> Bool
isOctDigit :: Word16 -> Bool
isOctDigit Word16
w = Word16
_0 Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
_7

isHexDigit :: Word16 -> Bool
isHexDigit :: Word16 -> Bool
isHexDigit Word16
w = Word16 -> Bool
isDigit Word16
w
            Bool -> Bool -> Bool
|| Word16
_A Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
_F
            Bool -> Bool -> Bool
|| Word16
_a Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
_f

isLetter :: Word16 -> Bool
isLetter :: Word16 -> Bool
isLetter = Char -> Bool
C.isLetter (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isMark :: Word16 -> Bool
isMark :: Word16 -> Bool
isMark = Char -> Bool
C.isMark (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isNumber :: Word16 -> Bool
isNumber :: Word16 -> Bool
isNumber = Char -> Bool
C.isNumber (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isPunctuation :: Word16 -> Bool
isPunctuation :: Word16 -> Bool
isPunctuation = Char -> Bool
C.isPunctuation (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isSymbol :: Word16 -> Bool
isSymbol :: Word16 -> Bool
isSymbol = Char -> Bool
C.isSymbol (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isSeparator :: Word16 -> Bool
isSeparator :: Word16 -> Bool
isSeparator = Char -> Bool
C.isSeparator (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

----------------------------------------------------------------

isAscii :: Word16 -> Bool
isAscii :: Word16 -> Bool
isAscii Word16
w = Word16
_nul Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
_del

isLatin1 :: Word16 -> Bool
isLatin1 :: Word16 -> Bool
isLatin1 = Char -> Bool
C.isLatin1 (Char -> Bool) -> (Word16 -> Char) -> Word16 -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

isAsciiUpper :: Word16 -> Bool
isAsciiUpper :: Word16 -> Bool
isAsciiUpper Word16
w = Word16
_A Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
_Z

isAsciiLower :: Word16 -> Bool
isAsciiLower :: Word16 -> Bool
isAsciiLower Word16
w = Word16
_a Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
w Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
_z

----------------------------------------------------------------

toUpper :: Word16 -> Word16
-- charToWord16 should be safe here, since C.toUpper doesn't go beyond Word16 maxbound
toUpper :: Word16 -> Word16
toUpper = Char -> Word16
charToWord16 (Char -> Word16) -> (Word16 -> Char) -> Word16 -> Word16
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Char
C.toUpper (Char -> Char) -> (Word16 -> Char) -> Word16 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

toLower :: Word16 -> Word16
-- charToWord16 should be safe here, since C.toLower doesn't go beyond Word16 maxbound
toLower :: Word16 -> Word16
toLower = Char -> Word16
charToWord16 (Char -> Word16) -> (Word16 -> Char) -> Word16 -> Word16
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Char
C.toLower (Char -> Char) -> (Word16 -> Char) -> Word16 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Char
word16ToChar

toTitle :: Word16 -> Word16
toTitle :: Word16 -> Word16
toTitle = Word16 -> Word16
toUpper

----------------------------------------------------------------

_nul, _tab, _lf, _vt, _np, _cr :: Word16
_nul :: Word16
_nul = Word16
0x00
_tab :: Word16
_tab = Word16
0x09
_lf :: Word16
_lf  = Word16
0x0a
_vt :: Word16
_vt  = Word16
0x0b
_np :: Word16
_np  = Word16
0x0c
_cr :: Word16
_cr  = Word16
0x0d

_space, _exclam, _quotedbl, _numbersign, _dollar, _percent, _ampersand, _quotesingle, _parenleft, _parenright, _asterisk, _plus, _comma, _hyphen, _period, _slash :: Word16
_space :: Word16
_space       = Word16
0x20
_exclam :: Word16
_exclam      = Word16
0x21
_quotedbl :: Word16
_quotedbl    = Word16
0x22
_numbersign :: Word16
_numbersign  = Word16
0x23
_dollar :: Word16
_dollar      = Word16
0x24
_percent :: Word16
_percent     = Word16
0x25
_ampersand :: Word16
_ampersand   = Word16
0x26
_quotesingle :: Word16
_quotesingle = Word16
0x27
_parenleft :: Word16
_parenleft   = Word16
0x28
_parenright :: Word16
_parenright  = Word16
0x29
_asterisk :: Word16
_asterisk    = Word16
0x2a
_plus :: Word16
_plus        = Word16
0x2b
_comma :: Word16
_comma       = Word16
0x2c
_hyphen :: Word16
_hyphen      = Word16
0x2d
_period :: Word16
_period      = Word16
0x2e
_slash :: Word16
_slash       = Word16
0x2f

_0, _1, _2, _3, _4, _5, _6, _7, _8, _9 :: Word16
_0 :: Word16
_0 = Word16
0x30
_1 :: Word16
_1 = Word16
0x31
_2 :: Word16
_2 = Word16
0x32
_3 :: Word16
_3 = Word16
0x33
_4 :: Word16
_4 = Word16
0x34
_5 :: Word16
_5 = Word16
0x35
_6 :: Word16
_6 = Word16
0x36
_7 :: Word16
_7 = Word16
0x37
_8 :: Word16
_8 = Word16
0x38
_9 :: Word16
_9 = Word16
0x39

_colon, _semicolon, _less, _equal, _greater, _question, _at :: Word16
_colon :: Word16
_colon      = Word16
0x3a
_semicolon :: Word16
_semicolon  = Word16
0x3b
_less :: Word16
_less       = Word16
0x3c
_equal :: Word16
_equal      = Word16
0x3d
_greater :: Word16
_greater    = Word16
0x3e
_question :: Word16
_question   = Word16
0x3f
_at :: Word16
_at         = Word16
0x40

_A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z :: Word16
_A :: Word16
_A = Word16
0x41
_B :: Word16
_B = Word16
0x42
_C :: Word16
_C = Word16
0x43
_D :: Word16
_D = Word16
0x44
_E :: Word16
_E = Word16
0x45
_F :: Word16
_F = Word16
0x46
_G :: Word16
_G = Word16
0x47
_H :: Word16
_H = Word16
0x48
_I :: Word16
_I = Word16
0x49
_J :: Word16
_J = Word16
0x4a
_K :: Word16
_K = Word16
0x4b
_L :: Word16
_L = Word16
0x4c
_M :: Word16
_M = Word16
0x4d
_N :: Word16
_N = Word16
0x4e
_O :: Word16
_O = Word16
0x4f
_P :: Word16
_P = Word16
0x50
_Q :: Word16
_Q = Word16
0x51
_R :: Word16
_R = Word16
0x52
_S :: Word16
_S = Word16
0x53
_T :: Word16
_T = Word16
0x54
_U :: Word16
_U = Word16
0x55
_V :: Word16
_V = Word16
0x56
_W :: Word16
_W = Word16
0x57
_X :: Word16
_X = Word16
0x58
_Y :: Word16
_Y = Word16
0x59
_Z :: Word16
_Z = Word16
0x5a

_bracketleft, _backslash, _bracketright, _circum, _underscore, _grave :: Word16
_bracketleft :: Word16
_bracketleft   = Word16
0x5b
_backslash :: Word16
_backslash    = Word16
0x5c
_bracketright :: Word16
_bracketright = Word16
0x5d
_circum :: Word16
_circum       = Word16
0x5e
_underscore :: Word16
_underscore   = Word16
0x5f
_grave :: Word16
_grave        = Word16
0x60

_a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z :: Word16
_a :: Word16
_a = Word16
0x61
_b :: Word16
_b = Word16
0x62
_c :: Word16
_c = Word16
0x63
_d :: Word16
_d = Word16
0x64
_e :: Word16
_e = Word16
0x65
_f :: Word16
_f = Word16
0x66
_g :: Word16
_g = Word16
0x67
_h :: Word16
_h = Word16
0x68
_i :: Word16
_i = Word16
0x69
_j :: Word16
_j = Word16
0x6a
_k :: Word16
_k = Word16
0x6b
_l :: Word16
_l = Word16
0x6c
_m :: Word16
_m = Word16
0x6d
_n :: Word16
_n = Word16
0x6e
_o :: Word16
_o = Word16
0x6f
_p :: Word16
_p = Word16
0x70
_q :: Word16
_q = Word16
0x71
_r :: Word16
_r = Word16
0x72
_s :: Word16
_s = Word16
0x73
_t :: Word16
_t = Word16
0x74
_u :: Word16
_u = Word16
0x75
_v :: Word16
_v = Word16
0x76
_w :: Word16
_w = Word16
0x77
_x :: Word16
_x = Word16
0x78
_y :: Word16
_y = Word16
0x79
_z :: Word16
_z = Word16
0x7a

_braceleft, _bar, _braceright, _tilde, _del :: Word16
_braceleft :: Word16
_braceleft  = Word16
0x7b
_bar :: Word16
_bar        = Word16
0x7c
_braceright :: Word16
_braceright = Word16
0x7d
_tilde :: Word16
_tilde      = Word16
0x7e
_del :: Word16
_del        = Word16
0x7f

_nbsp :: Word16
_nbsp :: Word16
_nbsp = Word16
0xa0

_ordfeminine, _softhyphen, _mu, _ordmasculine :: Word16
_ordfeminine :: Word16
_ordfeminine  = Word16
0xaa
_softhyphen :: Word16
_softhyphen   = Word16
0xad
_mu :: Word16
_mu           = Word16
0xb5
_ordmasculine :: Word16
_ordmasculine = Word16
0xba

_s2, _s3, _s1, _1'4, _1'2, _3'4  :: Word16
_s2 :: Word16
_s2 = Word16
0xb2
_s3 :: Word16
_s3 = Word16
0xb3
_s1 :: Word16
_s1 = Word16
0xb9
_1'4 :: Word16
_1'4 = Word16
0xbc
_1'2 :: Word16
_1'2 = Word16
0xbd
_3'4 :: Word16
_3'4 = Word16
0xbe

_Agrave, _Odieresis, _Oslash, _Thorn :: Word16
_Agrave :: Word16
_Agrave    = Word16
0xc0
_Odieresis :: Word16
_Odieresis = Word16
0xd6
_Oslash :: Word16
_Oslash    = Word16
0xd8
_Thorn :: Word16
_Thorn     = Word16
0xde

_germandbls, _agrave, _odieresis, _oslash, _thorn, _ydieresis :: Word16
_germandbls :: Word16
_germandbls = Word16
0xdf
_agrave :: Word16
_agrave     = Word16
0xe0
_odieresis :: Word16
_odieresis  = Word16
0xf6
_oslash :: Word16
_oslash     = Word16
0xf8
_thorn :: Word16
_thorn      = Word16
0xfe
_ydieresis :: Word16
_ydieresis  = Word16
0xff