    {-# LANGUAGE PatternSynonyms #-}
    module Data.Aeson.Internal.Word8 where

    import Data.Word (Word8)

    -------------------------------------------------------------------------------
    -- Word8 ASCII codes as patterns
    -------------------------------------------------------------------------------

    -- GHC-8.0 doesn't support giving multiple pattern synonyms type signature at once

    -- spaces
    pattern W8_SPACE :: Word8
    pattern W8_NL    :: Word8
    pattern W8_CR    :: Word8
    pattern W8_TAB   :: Word8

    pattern $mW8_SPACE :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_SPACE :: Word8
    W8_SPACE = 0x20
    pattern $mW8_NL :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_NL :: Word8
    W8_NL    = 0x0a
    pattern $mW8_CR :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_CR :: Word8
    W8_CR    = 0x0d
    pattern $mW8_TAB :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_TAB :: Word8
    W8_TAB   = 0x09

    -- punctuation
    pattern W8_BACKSLASH    :: Word8
    pattern W8_DOUBLE_QUOTE :: Word8
    pattern W8_DOT          :: Word8
    pattern W8_COMMA        :: Word8
    pattern W8_COLON        :: Word8

    pattern $mW8_BACKSLASH :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_BACKSLASH :: Word8
    W8_BACKSLASH    = 92
    pattern $mW8_COMMA :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_COMMA :: Word8
    W8_COMMA        = 44
    pattern $mW8_DOT :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_DOT :: Word8
    W8_DOT          = 46
    pattern $mW8_DOUBLE_QUOTE :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_DOUBLE_QUOTE :: Word8
    W8_DOUBLE_QUOTE = 34
    pattern $mW8_COLON :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_COLON :: Word8
    W8_COLON        = 58

    -- parentheses
    pattern W8_CLOSE_CURLY  :: Word8
    pattern W8_CLOSE_SQUARE :: Word8
    pattern W8_OPEN_SQUARE  :: Word8
    pattern W8_OPEN_CURLY   :: Word8

    pattern $mW8_OPEN_CURLY :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_OPEN_CURLY :: Word8
    W8_OPEN_CURLY   = 123
    pattern $mW8_OPEN_SQUARE :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_OPEN_SQUARE :: Word8
    W8_OPEN_SQUARE  = 91
    pattern $mW8_CLOSE_CURLY :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_CLOSE_CURLY :: Word8
    W8_CLOSE_CURLY  = 125
    pattern $mW8_CLOSE_SQUARE :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_CLOSE_SQUARE :: Word8
    W8_CLOSE_SQUARE = 93

    -- operators
    pattern W8_MINUS :: Word8
    pattern W8_PLUS  :: Word8

    pattern $mW8_PLUS :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_PLUS :: Word8
    W8_PLUS  = 43
    pattern $mW8_MINUS :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_MINUS :: Word8
    W8_MINUS = 45

    -- digits
    pattern W8_0 :: Word8
    pattern W8_9 :: Word8

    pattern $mW8_0 :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_0 :: Word8
    W8_0 = 48
    pattern $mW8_9 :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_9 :: Word8
    W8_9 = 57

    -- lower case
    pattern W8_e :: Word8
    pattern W8_f :: Word8
    pattern W8_n :: Word8
    pattern W8_t :: Word8

    pattern $mW8_e :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_e :: Word8
    W8_e = 101
    pattern $mW8_f :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_f :: Word8
    W8_f = 102
    pattern $mW8_n :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_n :: Word8
    W8_n = 110
    pattern $mW8_t :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_t :: Word8
    W8_t = 116

    -- upper case
    pattern W8_E :: Word8
    pattern $mW8_E :: forall {r}. Word8 -> ((# #) -> r) -> ((# #) -> r) -> r
    $bW8_E :: Word8
    W8_E = 69