packages feed

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