-- |
-- Lower-level parsers, which avoid overriding the native Attoparsec names.
module Attoparsec.Data.Parsers where

import Attoparsec.Data.Prelude hiding (bool)
import Data.Attoparsec.Text
import qualified Data.Text as Text
import qualified GHC.Show

-- |
-- Parse the output of the 'show' function applied to 'String' or 'Text'
-- into what was used for its input.
show :: Parser Text
show :: Parser Text
show =
  Char -> Parser Char
char Char
'"' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text
body forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Char
char Char
'"'
  where
    body :: Parser Text
body =
      forall a. Monoid a => [a] -> a
mconcat forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser Text
chunk
      where
        chunk :: Parser Text
chunk =
          Parser Text
escaped forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text
nonEscaped
        nonEscaped :: Parser Text
nonEscaped =
          (Char -> Bool) -> Parser Text
takeWhile1 (\Char
a -> Char
a forall a. Eq a => a -> a -> Bool
/= Char
'\\' Bool -> Bool -> Bool
&& Char
a forall a. Eq a => a -> a -> Bool
/= Char
'"')
        escaped :: Parser Text
escaped =
          Char -> Text
Text.singleton forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Char
escapedChar

-- https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Show.html#showLitChar
escapedChar :: Parser Char
escapedChar :: Parser Char
escapedChar =
  Char -> Parser Char
char Char
'\\' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Char
escapedCharBody

escapedCharBody :: Parser Char
escapedCharBody :: Parser Char
escapedCharBody =
  Char -> Parser Char
char Char
'\\'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser Char
char Char
'a'
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\a'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser Char
char Char
'b'
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\b'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser Char
char Char
'f'
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\f'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser Char
char Char
'n'
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\n'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser Char
char Char
'r'
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\r'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser Char
char Char
't'
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\t'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Char -> Parser Char
char Char
'v'
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\v'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text
string Text
"DEL"
    forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Char
'\DEL'
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Char
ordEscapedCharBody
    forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Char
asciiTabEscapedCharBody

asciiTabEscapedCharBody :: Parser Char
asciiTabEscapedCharBody :: Parser Char
asciiTabEscapedCharBody =
  forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> String -> Parser Char
asciiTabChar [Int
0 ..] [String]
GHC.Show.asciiTab forall a b. a -> (a -> b) -> b
& forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
  where
    asciiTabChar :: Int -> String -> Parser Char
asciiTabChar Int
index String
chars =
      Text -> Parser Text
string (forall a. IsString a => String -> a
fromString String
chars) forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Int -> Char
chr Int
index

ordEscapedCharBody :: Parser Char
ordEscapedCharBody :: Parser Char
ordEscapedCharBody =
  Int -> Char
chr forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Integral a => Parser a
decimal