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