module HaskellWorks.Data.Json.Internal.Standard.Cursor.Token
  ( jsonTokenAt
  ) where

import Data.ByteString.Internal                                as BSI
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Drop
import HaskellWorks.Data.Json.Internal.Standard.Token.Tokenize
import HaskellWorks.Data.Json.Standard.Cursor.Generic
import HaskellWorks.Data.Positioning
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import Prelude                                                 hiding (drop)

import qualified Data.Attoparsec.ByteString.Char8 as ABC

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