{-# OPTIONS_GHC-funbox-strict-fields #-}
{-# LANGUAGE BangPatterns      #-}
{-# LANGUAGE OverloadedStrings #-}

module HaskellWorks.Data.Xml.Internal.Blank
  ( blankXml
  , BlankData(..)
  ) where

import Data.ByteString                      (ByteString)
import Data.Word
import Data.Word8
import HaskellWorks.Data.Xml.Internal.Words
import Prelude

import qualified Data.ByteString as BS

type ExpectedChar      = Word8

data BlankState
  = InXml
  | InTag
  | InAttrList
  | InCloseTag
  | InClose
  | InBang !Int
  | InString !ExpectedChar
  | InText
  | InMeta
  | InCdataTag
  | InCdata !Int
  | InRem !Int
  | InIdent

data BlankData = BlankData
  { BlankData -> BlankState
blankState :: !BlankState
  , BlankData -> Word8
blankA     :: !Word8
  , BlankData -> Word8
blankB     :: !Word8
  , BlankData -> ByteString
blankC     :: !ByteString
  }

blankXml :: [ByteString] -> [ByteString]
blankXml :: [ByteString] -> [ByteString]
blankXml = ByteString -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan1 ByteString
BS.empty BlankState
InXml

blankXmlPlan1 :: ByteString -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan1 :: ByteString -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan1 ByteString
as BlankState
lastState [ByteString]
is = case [ByteString]
is of
  (ByteString
bs:[ByteString]
bss) -> do
    let cs :: ByteString
cs = ByteString
as ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
bs
    case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
cs of
      Just (Word8
d, ByteString
ds) -> case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
ds of
        Just (Word8
e, ByteString
es) -> Bool
-> Word8
-> Word8
-> ByteString
-> BlankState
-> [ByteString]
-> [ByteString]
blankXmlRun Bool
False Word8
d Word8
e ByteString
es BlankState
lastState [ByteString]
bss
        Maybe (Word8, ByteString)
Nothing      -> ByteString -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan1 ByteString
cs BlankState
lastState [ByteString]
bss
      Maybe (Word8, ByteString)
Nothing -> ByteString -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan1 ByteString
cs BlankState
lastState [ByteString]
bss
  [] -> [(Word8 -> Word8) -> ByteString -> ByteString
BS.map (Word8 -> Word8 -> Word8
forall a b. a -> b -> a
const Word8
_space) ByteString
as]

blankXmlPlan2 :: Word8 -> Word8 -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan2 :: Word8 -> Word8 -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan2 Word8
a Word8
b BlankState
lastState [ByteString]
is = case [ByteString]
is of
  (ByteString
cs:[ByteString]
css) -> Bool
-> Word8
-> Word8
-> ByteString
-> BlankState
-> [ByteString]
-> [ByteString]
blankXmlRun Bool
False Word8
a Word8
b ByteString
cs BlankState
lastState [ByteString]
css
  []       -> Bool
-> Word8
-> Word8
-> ByteString
-> BlankState
-> [ByteString]
-> [ByteString]
blankXmlRun Bool
True Word8
a Word8
b ([Word8] -> ByteString
BS.pack [Word8
_space, Word8
_space]) BlankState
lastState []

blankXmlRun :: Bool -> Word8 -> Word8 -> ByteString -> BlankState -> [ByteString] -> [ByteString]
blankXmlRun :: Bool
-> Word8
-> Word8
-> ByteString
-> BlankState
-> [ByteString]
-> [ByteString]
blankXmlRun Bool
done Word8
a Word8
b ByteString
cs BlankState
lastState [ByteString]
is = do
  let (!ByteString
ds, Maybe BlankData
mState) = Int
-> (BlankData -> Maybe (Word8, BlankData))
-> BlankData
-> (ByteString, Maybe BlankData)
forall a.
Int -> (a -> Maybe (Word8, a)) -> a -> (ByteString, Maybe a)
BS.unfoldrN (ByteString -> Int
BS.length ByteString
cs) BlankData -> Maybe (Word8, BlankData)
blankByteString (BlankState -> Word8 -> Word8 -> ByteString -> BlankData
BlankData BlankState
lastState Word8
a Word8
b ByteString
cs)
  case Maybe BlankData
mState of
    Just (BlankData !BlankState
nextState Word8
_ Word8
_ ByteString
_) -> do
      let (Word8
yy, Word8
zz) = case ByteString -> Maybe (ByteString, Word8)
BS.unsnoc ByteString
cs of
            Just (ByteString
ys, Word8
z) -> case ByteString -> Maybe (ByteString, Word8)
BS.unsnoc ByteString
ys of
              Just (ByteString
_, Word8
y) -> (Word8
y, Word8
z)
              Maybe (ByteString, Word8)
Nothing     -> (Word8
b, Word8
z)
            Maybe (ByteString, Word8)
Nothing -> (Word8
a, Word8
b)
      if Bool
done
        then [ByteString
ds]
        else ByteString
dsByteString -> [ByteString] -> [ByteString]
forall a. a -> [a] -> [a]
:Word8 -> Word8 -> BlankState -> [ByteString] -> [ByteString]
blankXmlPlan2 Word8
yy Word8
zz BlankState
nextState [ByteString]
is
    Maybe BlankData
Nothing -> [Char] -> [ByteString]
forall a. HasCallStack => [Char] -> a
error [Char]
"No state: blankXmlRun"

mkNext :: Word8 -> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext :: Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
w BlankState
s Word8
a ByteString
bs = case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
bs of
  Just (Word8
b, ByteString
cs) -> (Word8, BlankData) -> Maybe (Word8, BlankData)
forall a. a -> Maybe a
Just (Word8
w, BlankState -> Word8 -> Word8 -> ByteString -> BlankData
BlankData BlankState
s Word8
a Word8
b ByteString
cs)
  Maybe (Word8, ByteString)
Nothing      -> [Char] -> Maybe (Word8, BlankData)
forall a. HasCallStack => [Char] -> a
error [Char]
"This should never happen"
{-# INLINE mkNext #-}

blankByteString :: BlankData -> Maybe (Word8, BlankData)
blankByteString :: BlankData -> Maybe (Word8, BlankData)
blankByteString (BlankData  BlankState
InXml        Word8
a Word8
b ByteString
cs) | Word8 -> Word8 -> Bool
isMetaStart Word8
a Word8
b         = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_bracketleft   BlankState
InMeta          Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InXml        Word8
a Word8
b ByteString
cs) | Word8 -> Word8 -> Bool
isEndTag    Word8
a Word8
b         = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InCloseTag      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InXml        Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isTextStart Word8
a           = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_t             BlankState
InText          Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InXml        Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_less              = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_less          BlankState
InTag           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InXml        Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InXml        Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InTag        Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_parenleft     BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InTag        Word8
a Word8
b ByteString
cs) | Word8 -> Word8 -> Bool
isTagClose Word8
a Word8
b          = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InClose         Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InTag        Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater           = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InTag        Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              BlankState
InTag           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InTag        Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InTag           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InCloseTag   Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater           = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_greater       BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InCloseTag   Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              BlankState
InCloseTag      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InCloseTag   Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InCloseTag      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InAttrList   Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater           = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_parenright    BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InAttrList   Word8
a Word8
b ByteString
cs) | Word8 -> Word8 -> Bool
isTagClose Word8
a Word8
b          = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_parenright    BlankState
InClose         Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InAttrList   Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isNameStartChar Word8
a       = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_a             BlankState
InIdent         Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InAttrList   Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isQuote Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_v             (Word8 -> BlankState
InString Word8
a)    Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InAttrList   Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InAttrList   Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InClose      Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_greater       BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InIdent      Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isNameChar Word8
a            = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InIdent         Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InIdent      Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InIdent      Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_equal             = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InIdent      Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InIdent      Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData (InString Word8
q ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
q                  = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InAttrList      Word8
b ByteString
cs
blankByteString (BlankData (InString Word8
q ) Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              (Word8 -> BlankState
InString Word8
q)    Word8
b ByteString
cs
blankByteString (BlankData (InString Word8
q ) Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Word8 -> BlankState
InString Word8
q)    Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InText       Word8
a Word8
b ByteString
cs) | Word8 -> Word8 -> Bool
isEndTag Word8
a Word8
b            = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InCloseTag      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InText       Word8
_ Word8
b ByteString
cs) | Word8
b Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_less              = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InText       Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              BlankState
InText          Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InText       Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InText          Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InMeta       Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_exclam            = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InMeta          Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InMeta       Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_hyphen            = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InRem Int
0)       Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InMeta       Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_bracketleft       = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InCdataTag      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InMeta       Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater           = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_bracketright  BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InMeta       Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              (Int -> BlankState
InBang Int
1)      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InMeta       Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InBang Int
1)      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InCdataTag   Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_bracketleft       = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InCdata Int
0)     Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InCdataTag   Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              BlankState
InCdataTag      Word8
b ByteString
cs
blankByteString (BlankData  BlankState
InCdataTag   Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         BlankState
InCdataTag      Word8
b ByteString
cs
blankByteString (BlankData (InCdata Int
n  ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
2 = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_bracketright  BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData (InCdata Int
n  ) Word8
a Word8
b ByteString
cs) | Word8 -> Word8 -> Bool
isCdataEnd Word8
a Word8
b Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InCdata (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)) Word8
b ByteString
cs
blankByteString (BlankData (InCdata Int
n  ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_bracketright      = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InCdata (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)) Word8
b ByteString
cs
blankByteString (BlankData (InCdata Int
_  ) Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              (Int -> BlankState
InCdata Int
0)     Word8
b ByteString
cs
blankByteString (BlankData (InCdata Int
_  ) Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InCdata Int
0)     Word8
b ByteString
cs
blankByteString (BlankData (InRem Int
n    ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
2 = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_bracketright  BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData (InRem Int
n    ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_hyphen            = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InRem (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1))   Word8
b ByteString
cs
blankByteString (BlankData (InRem Int
_    ) Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              (Int -> BlankState
InRem Int
0)       Word8
b ByteString
cs
blankByteString (BlankData (InRem Int
_    ) Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InRem Int
0)       Word8
b ByteString
cs
blankByteString (BlankData (InBang Int
n   ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_less              = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_bracketleft   (Int -> BlankState
InBang (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1))  Word8
b ByteString
cs
blankByteString (BlankData (InBang Int
n   ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_bracketright  BlankState
InXml           Word8
b ByteString
cs
blankByteString (BlankData (InBang Int
n   ) Word8
a Word8
b ByteString
cs) | Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater           = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_bracketright  (Int -> BlankState
InBang (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1))  Word8
b ByteString
cs
blankByteString (BlankData (InBang Int
n   ) Word8
a Word8
b ByteString
cs) | Word8 -> Bool
isSpace Word8
a               = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
a              (Int -> BlankState
InBang Int
n)      Word8
b ByteString
cs
blankByteString (BlankData (InBang Int
n   ) Word8
_ Word8
b ByteString
cs) = Word8
-> BlankState -> Word8 -> ByteString -> Maybe (Word8, BlankData)
mkNext Word8
_space         (Int -> BlankState
InBang Int
n)      Word8
b ByteString
cs
{-# INLINE blankByteString #-}

isEndTag :: Word8 -> Word8 -> Bool
isEndTag :: Word8 -> Word8 -> Bool
isEndTag Word8
a Word8
b = Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_less Bool -> Bool -> Bool
&& Word8
b Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_slash
{-# INLINE isEndTag #-}

isTagClose :: Word8 -> Word8 -> Bool
isTagClose :: Word8 -> Word8 -> Bool
isTagClose Word8
a Word8
b = Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_slash Bool -> Bool -> Bool
|| ((Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_slash Bool -> Bool -> Bool
|| Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_question) Bool -> Bool -> Bool
&& Word8
b Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater)
{-# INLINE isTagClose #-}

isMetaStart :: Word8 -> Word8 -> Bool
isMetaStart :: Word8 -> Word8 -> Bool
isMetaStart Word8
a Word8
b = Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_less Bool -> Bool -> Bool
&& Word8
b Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_exclam
{-# INLINE isMetaStart #-}

isCdataEnd :: Word8 -> Word8 -> Bool
isCdataEnd :: Word8 -> Word8 -> Bool
isCdataEnd Word8
a Word8
b = Word8
a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_bracketright Bool -> Bool -> Bool
&& Word8
b Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
_greater
{-# INLINE isCdataEnd #-}