module HaskellWorks.Data.Json.Succinct.Cursor.Token
  ( jsonTokenAt
  ) where

import qualified Data.Attoparsec.ByteString.Char8                           as ABC
import           Data.ByteString.Internal                                   as BSI
import           HaskellWorks.Data.Bits.BitWise
import           HaskellWorks.Data.Json.Succinct.Cursor.Internal
import           HaskellWorks.Data.Json.Token.Tokenize
import           HaskellWorks.Data.Positioning
import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1
import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1
import           HaskellWorks.Data.Vector.VectorLike

jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe (JsonToken String Double)
jsonTokenAt :: JsonCursor ByteString v w -> Maybe (JsonToken String Double)
jsonTokenAt JsonCursor ByteString v w
k = if JsonCursor ByteString v w -> w
forall t v w. JsonCursor t v w -> w
balancedParens JsonCursor ByteString v w
k w -> Position -> Bool
forall a. TestBit a => a -> Position -> Bool
.?. Count -> Position
lastPositionOf (JsonCursor ByteString v w -> Count
forall t v w. JsonCursor t v w -> Count
cursorRank JsonCursor ByteString v w
k)
  then case Parser (JsonToken String Double)
-> ByteString -> Result (JsonToken String Double)
forall a. Parser a -> ByteString -> Result a
ABC.parse Parser (JsonToken String Double)
forall t s d. ParseJson t s d => Parser t (JsonToken s d)
parseJsonToken (Count -> ByteString -> ByteString
forall v. Seq v => Count -> v -> v
vDrop (Position -> Count
toCount (JsonCursor ByteString v w -> Position
forall w v s. (Rank1 w, Select1 v) => JsonCursor s v w -> Position
jsonCursorPos JsonCursor ByteString v w
k)) (JsonCursor ByteString v w -> ByteString
forall t v w. JsonCursor t v w -> t
cursorText JsonCursor ByteString v w
k)) of
    ABC.Fail    {}  -> String -> Maybe (JsonToken String Double)
forall a. HasCallStack => String -> a
error String
"Failed to parse token in cursor"
    ABC.Partial ByteString -> Result (JsonToken String Double)
_   -> String -> Maybe (JsonToken String Double)
forall a. HasCallStack => String -> a
error String
"Failed to parse token in cursor"
    ABC.Done    ByteString
_ JsonToken String Double
r -> JsonToken String Double -> Maybe (JsonToken String Double)
forall a. a -> Maybe a
Just JsonToken String Double
r
  else Maybe (JsonToken String Double)
forall a. Maybe a
Nothing