Z-Data-2.0.1.0: Z/Data/ASCII.hs
{-|
Module : Z.Data.ASCII
Description : ASCII chars
Copyright : (c) Dong Han, 2020
License : BSD
Maintainer : winterland1989@gmail.com
Stability : experimental
Portability : non-portable
ASCII Chars utility.
-}
module Z.Data.ASCII where
import GHC.Word
import GHC.Exts
-- | Conversion between 'Word8' and 'Char'. Should compile to a no-op.
--
w2c :: Word8 -> Char
{-# INLINE w2c #-}
w2c (W8# w#) = C# (chr# (word2Int# (word8ToWord# w#)))
-- | Unsafe conversion between 'Char' and 'Word8'. This is a no-op and
-- silently truncates to 8 bits Chars > @\\255@.
c2w :: Char -> Word8
{-# INLINE c2w #-}
c2w (C# c#) = W8# (wordToWord8# (int2Word# (ord# c#)))
-- | @\\NUL <= w && w <= \\DEL@
isASCII :: Word8 -> Bool
{-# INLINE isASCII #-}
isASCII w = w <= DEL
-- | @A ~ Z@
isUpper :: Word8 -> Bool
{-# INLINE isUpper #-}
isUpper w = w - LETTER_A <= 25
-- | @a ~ z@
isLower :: Word8 -> Bool
{-# INLINE isLower #-}
isLower w = w - LETTER_a <= 25
-- | @A ~ Z@ => @a ~ z@
toLower :: Word8 -> Word8
{-# INLINE toLower #-}
toLower w
| 65 <= w && w <= 90 = w + 32
| otherwise = w
-- | @a ~ z@ => @A ~ Z@
toUpper :: Word8 -> Word8
{-# INLINE toUpper #-}
toUpper w
| 97 <= w && w <= 122 = w - 32
| otherwise = w
-- | @A ~ Z@ => @a ~ z@, @À ~ Ö@ => @à ~ ö@, @Ø ~ Þ@ => @ø ~ þ@
toLowerLatin :: Word8 -> Word8
{-# INLINE toLowerLatin #-}
toLowerLatin w
| 65 <= w && w <= 90 ||
192 <= w && w <= 214 ||
216 <= w && w <= 222 = w + 32
| otherwise = w
-- | @a ~ z@ => @A ~ Z@, @à ~ ö@ => @À ~ Ö@, @ø ~ þ@ => @Ø ~ Þ@
toUpperLatin :: Word8 -> Word8
{-# INLINE toUpperLatin #-}
toUpperLatin w
| 97 <= w && w <= 122 ||
224 <= w && w <= 246 ||
248 <= w && w <= 254 = w - 32
| otherwise = w
-- | @ISO-8859-1@ control letter.
isControl :: Word8 -> Bool
{-# INLINE isControl #-}
isControl w = w <= 0x1f || w - DEL <= 32
-- | @ISO-8859-1@ space letter.
isSpace :: Word8 -> Bool
{-# INLINE isSpace #-}
isSpace w = w == SPACE || w - TAB <= 4 || w == 0xa0
-- | @0 ~ 9@
isDigit :: Word8 -> Bool
{-# INLINE isDigit #-}
isDigit w = w - DIGIT_0 <= 9
-- | @0 ~ 7@
isOctDigit :: Word8 -> Bool
{-# INLINE isOctDigit #-}
isOctDigit w = w - DIGIT_0 <= 7
-- | @0 ~ 9, A ~ F, a ~ f@
isHexDigit :: Word8 -> Bool
{-# INLINE isHexDigit #-}
isHexDigit w = w - DIGIT_0 <= 9 || w - LETTER_A <= 5 || w - LETTER_a <= 5
----------------------------------------------------------------
-- | @\\NUL@
pattern NUL :: Word8
pattern NUL = 0x00
-- | Start of Heading
pattern SOH :: Word8
pattern SOH = 0x01
-- | Start of Text
pattern STX :: Word8
pattern STX = 0x02
-- | End of Text
pattern ETX :: Word8
pattern ETX = 0x03
-- | End of Transmission
pattern EOT :: Word8
pattern EOT = 0x04
-- | Enquiry
pattern ENQ :: Word8
pattern ENQ = 0x05
-- | Acknowledgment
pattern ACK :: Word8
pattern ACK = 0x06
-- | Bell
pattern BEL :: Word8
pattern BEL = 0x07
-- | Back Space
pattern BS :: Word8
pattern BS = 0x08
-- | @\\t@
pattern TAB :: Word8
pattern TAB = 0x09
-- | @\\n@
pattern NEWLINE :: Word8
pattern NEWLINE = 0x0a
-- | @\\v@
pattern VERTICAL_TAB :: Word8
pattern VERTICAL_TAB = 0x0b
-- | @\\f@
pattern FORM_FEED :: Word8
pattern FORM_FEED = 0x0c
-- | @\\r@
pattern CARRIAGE_RETURN :: Word8
pattern CARRIAGE_RETURN = 0x0d
-- | Shift Out / X-On
pattern SO :: Word8
pattern SO = 0x0e
-- | Shift In / X-Off
pattern SI :: Word8
pattern SI = 0x0f
-- | Data Line Escape
pattern DLE :: Word8
pattern DLE = 0x10
-- | Device Control 1 (oft. XON)
pattern DC1 :: Word8
pattern DC1 = 0x11
-- | Device Control 2
pattern DC2 :: Word8
pattern DC2 = 0x12
-- | Device Control 3 (oft. XOFF)
pattern DC3 :: Word8
pattern DC3 = 0x13
-- | Device Control 4
pattern DC4 :: Word8
pattern DC4 = 0x14
-- | Negative Acknowledgement
pattern NAK :: Word8
pattern NAK = 0x15
-- | Synchronous Idle
pattern SYN :: Word8
pattern SYN = 0x16
-- | End of Transmit Block
pattern ETB :: Word8
pattern ETB = 0x17
-- | Cancel
pattern CAN :: Word8
pattern CAN = 0x18
-- | End of Medium
pattern EM :: Word8
pattern EM = 0x19
-- | Substitute
pattern SUB :: Word8
pattern SUB = 0x1a
-- | Escape
pattern ESC :: Word8
pattern ESC = 0x1b
-- | File Separator
pattern FS :: Word8
pattern FS = 0x1c
-- | Group Separator
pattern GS :: Word8
pattern GS = 0x1d
-- | Record Separator
pattern RS :: Word8
pattern RS = 0x1e
-- | Unit Separator
pattern US :: Word8
pattern US = 0x1f
-- | @\' \'@
pattern SPACE :: Word8
pattern SPACE = 0x20
-- | @\!@
pattern EXCLAM :: Word8
pattern EXCLAM = 0x21
-- | @\"@
pattern DOUBLE_QUOTE :: Word8
pattern DOUBLE_QUOTE = 0x22
-- | @\#@
pattern HASH :: Word8
pattern HASH = 0x23
-- | @\#@
pattern NUMBER_SIGN :: Word8
pattern NUMBER_SIGN = 0x23
-- | @\$@
pattern DOLLAR :: Word8
pattern DOLLAR = 0x24
-- | @\%@
pattern PERCENT :: Word8
pattern PERCENT = 0x25
-- | @\&@
pattern AMPERSAND :: Word8
pattern AMPERSAND = 0x26
-- | @\&@
pattern AND :: Word8
pattern AND = 0x26
-- | @\'@
pattern SINGLE_QUOTE :: Word8
pattern SINGLE_QUOTE = 0x27
-- | @(@
pattern PAREN_LEFT :: Word8
pattern PAREN_LEFT = 0x28
-- | @)@
pattern PAREN_RIGHT :: Word8
pattern PAREN_RIGHT = 0x29
-- | @*@
pattern ASTERISK :: Word8
pattern ASTERISK = 0x2a
-- | @+@
pattern PLUS :: Word8
pattern PLUS = 0x2b
-- | @,@
pattern COMMA :: Word8
pattern COMMA = 0x2c
-- | @-@
pattern HYPHEN :: Word8
pattern HYPHEN = 0x2d
-- | @-@
pattern MINUS :: Word8
pattern MINUS = 0x2d
-- | @.@
pattern PERIOD :: Word8
pattern PERIOD = 0x2e
-- | @.@
pattern DOT :: Word8
pattern DOT = 0x2e
-- | @\/@
pattern SLASH :: Word8
pattern SLASH = 0x2f
pattern DIGIT_0 :: Word8
pattern DIGIT_0 = 0x30
pattern DIGIT_1 :: Word8
pattern DIGIT_1 = 0x31
pattern DIGIT_2 :: Word8
pattern DIGIT_2 = 0x32
pattern DIGIT_3 :: Word8
pattern DIGIT_3 = 0x33
pattern DIGIT_4 :: Word8
pattern DIGIT_4 = 0x34
pattern DIGIT_5 :: Word8
pattern DIGIT_5 = 0x35
pattern DIGIT_6 :: Word8
pattern DIGIT_6 = 0x36
pattern DIGIT_7 :: Word8
pattern DIGIT_7 = 0x37
pattern DIGIT_8 :: Word8
pattern DIGIT_8 = 0x38
pattern DIGIT_9 :: Word8
pattern DIGIT_9 = 0x39
-- | @:@
pattern COLON :: Word8
pattern COLON = 0x3a
-- | @;@
pattern SEMICOLON :: Word8
pattern SEMICOLON = 0x3b
-- | @<@
pattern LESS :: Word8
pattern LESS = 0x3c
-- | @<@
pattern ANGLE_LEFT :: Word8
pattern ANGLE_LEFT = 0x3c
-- | @=@
pattern EQUAL :: Word8
pattern EQUAL = 0x3d
-- | @>@
pattern GREATER :: Word8
pattern GREATER = 0x3e
-- | @>@
pattern ANGLE_RIGHT :: Word8
pattern ANGLE_RIGHT = 0x3e
-- | @\?@
pattern QUESTION :: Word8
pattern QUESTION = 0x3f
-- | @\@@
pattern AT :: Word8
pattern AT = 0x40
pattern LETTER_A :: Word8
pattern LETTER_A = 0x41
pattern LETTER_B :: Word8
pattern LETTER_B = 0x42
pattern LETTER_C :: Word8
pattern LETTER_C = 0x43
pattern LETTER_D :: Word8
pattern LETTER_D = 0x44
pattern LETTER_E :: Word8
pattern LETTER_E = 0x45
pattern LETTER_F :: Word8
pattern LETTER_F = 0x46
pattern LETTER_G :: Word8
pattern LETTER_G = 0x47
pattern LETTER_H :: Word8
pattern LETTER_H = 0x48
pattern LETTER_I :: Word8
pattern LETTER_I = 0x49
pattern LETTER_J :: Word8
pattern LETTER_J = 0x4a
pattern LETTER_K :: Word8
pattern LETTER_K = 0x4b
pattern LETTER_L :: Word8
pattern LETTER_L = 0x4c
pattern LETTER_M :: Word8
pattern LETTER_M = 0x4d
pattern LETTER_N :: Word8
pattern LETTER_N = 0x4e
pattern LETTER_O :: Word8
pattern LETTER_O = 0x4f
pattern LETTER_P :: Word8
pattern LETTER_P = 0x50
pattern LETTER_Q :: Word8
pattern LETTER_Q = 0x51
pattern LETTER_R :: Word8
pattern LETTER_R = 0x52
pattern LETTER_S :: Word8
pattern LETTER_S = 0x53
pattern LETTER_T :: Word8
pattern LETTER_T = 0x54
pattern LETTER_U :: Word8
pattern LETTER_U = 0x55
pattern LETTER_V :: Word8
pattern LETTER_V = 0x56
pattern LETTER_W :: Word8
pattern LETTER_W = 0x57
pattern LETTER_X :: Word8
pattern LETTER_X = 0x58
pattern LETTER_Y :: Word8
pattern LETTER_Y = 0x59
pattern LETTER_Z :: Word8
pattern LETTER_Z = 0x5a
-- | @[@
pattern BRACKET_LEFT :: Word8
pattern BRACKET_LEFT = 0x5b
-- | @[@
pattern SQUARE_LEFT :: Word8
pattern SQUARE_LEFT = 0x5b
-- | @\\@
pattern BACKSLASH :: Word8
pattern BACKSLASH = 0x5c
-- | @]@
pattern BRACKET_RIGHT :: Word8
pattern BRACKET_RIGHT = 0x5d
-- | @]@
pattern SQUARE_RIGHT :: Word8
pattern SQUARE_RIGHT = 0x5d
-- | @^@
pattern CIRCUM :: Word8
pattern CIRCUM = 0x5e
-- | @_@
pattern UNDERSCORE :: Word8
pattern UNDERSCORE = 0x5f
-- | @`@
pattern GRAVE :: Word8
pattern GRAVE = 0x60
pattern LETTER_a :: Word8
pattern LETTER_a = 0x61
pattern LETTER_b :: Word8
pattern LETTER_b = 0x62
pattern LETTER_c :: Word8
pattern LETTER_c = 0x63
pattern LETTER_d :: Word8
pattern LETTER_d = 0x64
pattern LETTER_e :: Word8
pattern LETTER_e = 0x65
pattern LETTER_f :: Word8
pattern LETTER_f = 0x66
pattern LETTER_g :: Word8
pattern LETTER_g = 0x67
pattern LETTER_h :: Word8
pattern LETTER_h = 0x68
pattern LETTER_i :: Word8
pattern LETTER_i = 0x69
pattern LETTER_j :: Word8
pattern LETTER_j = 0x6a
pattern LETTER_k :: Word8
pattern LETTER_k = 0x6b
pattern LETTER_l :: Word8
pattern LETTER_l = 0x6c
pattern LETTER_m :: Word8
pattern LETTER_m = 0x6d
pattern LETTER_n :: Word8
pattern LETTER_n = 0x6e
pattern LETTER_o :: Word8
pattern LETTER_o = 0x6f
pattern LETTER_p :: Word8
pattern LETTER_p = 0x70
pattern LETTER_q :: Word8
pattern LETTER_q = 0x71
pattern LETTER_r :: Word8
pattern LETTER_r = 0x72
pattern LETTER_s :: Word8
pattern LETTER_s = 0x73
pattern LETTER_t :: Word8
pattern LETTER_t = 0x74
pattern LETTER_u :: Word8
pattern LETTER_u = 0x75
pattern LETTER_v :: Word8
pattern LETTER_v = 0x76
pattern LETTER_w :: Word8
pattern LETTER_w = 0x77
pattern LETTER_x :: Word8
pattern LETTER_x = 0x78
pattern LETTER_y :: Word8
pattern LETTER_y = 0x79
pattern LETTER_z :: Word8
pattern LETTER_z = 0x7a
-- | @{@
pattern BRACE_LEFT :: Word8
pattern BRACE_LEFT = 0x7b
-- | @{@
pattern CURLY_LEFT :: Word8
pattern CURLY_LEFT = 0x7b
-- | @|@
pattern BAR :: Word8
pattern BAR = 0x7c
-- | @|@
pattern OR :: Word8
pattern OR = 0x7c
-- | @}@
pattern BRACE_RIGHT :: Word8
pattern BRACE_RIGHT = 0x7d
-- | @}@
pattern CURLY_RIGHT :: Word8
pattern CURLY_RIGHT = 0x7d
-- | @~@
pattern TILDE :: Word8
pattern TILDE = 0x7e
-- | @\\DEL@
pattern DEL :: Word8
pattern DEL = 0x7f