module HaskellWorks.Data.Xml.Succinct.Cursor.Token
  ( xmlTokenAt
  ) where

import Data.ByteString                                (ByteString)
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Drop
import HaskellWorks.Data.Positioning
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import HaskellWorks.Data.Xml.Succinct.Cursor.Internal
import HaskellWorks.Data.Xml.Token.Tokenize
import Prelude                                        hiding (drop)

import qualified Data.Attoparsec.ByteString.Char8 as ABC

xmlTokenAt :: (Rank1 w, Select1 v, TestBit w) => XmlCursor ByteString v w -> Maybe (XmlToken String Double)
xmlTokenAt :: XmlCursor ByteString v w -> Maybe (XmlToken String Double)
xmlTokenAt XmlCursor ByteString v w
k = if XmlCursor ByteString v w -> w
forall t v w. XmlCursor t v w -> w
balancedParens XmlCursor ByteString v w
k w -> Position -> Bool
forall a. TestBit a => a -> Position -> Bool
.?. Count -> Position
lastPositionOf (XmlCursor ByteString v w -> Count
forall t v w. XmlCursor t v w -> Count
cursorRank XmlCursor ByteString v w
k)
  then case Parser (XmlToken String Double)
-> ByteString -> Result (XmlToken String Double)
forall a. Parser a -> ByteString -> Result a
ABC.parse Parser (XmlToken String Double)
forall t s d. ParseXml t s d => Parser t (XmlToken s d)
parseXmlToken (Count -> ByteString -> ByteString
forall v. Drop v => Count -> v -> v
drop (Position -> Count
forall a. ToCount a => a -> Count
toCount (XmlCursor ByteString v w -> Position
forall w v s. (Rank1 w, Select1 v) => XmlCursor s v w -> Position
xmlCursorPos XmlCursor ByteString v w
k)) (XmlCursor ByteString v w -> ByteString
forall t v w. XmlCursor t v w -> t
cursorText XmlCursor ByteString v w
k)) of
    ABC.Fail    {}  -> String -> Maybe (XmlToken String Double)
forall a. HasCallStack => String -> a
error String
"Failed to parse token in cursor"
    ABC.Partial ByteString -> Result (XmlToken String Double)
_   -> String -> Maybe (XmlToken String Double)
forall a. HasCallStack => String -> a
error String
"Failed to parse token in cursor"
    ABC.Done    ByteString
_ XmlToken String Double
r -> XmlToken String Double -> Maybe (XmlToken String Double)
forall a. a -> Maybe a
Just XmlToken String Double
r
  else Maybe (XmlToken String Double)
forall a. Maybe a
Nothing