module HaskellWorks.Data.Json.Succinct.Cursor.CursorType
( HasJsonCursorType(..)
, JsonCursorType(..)
, jsonCursorPos
) where
import qualified Data.ByteString as BS
import Data.Char
import HaskellWorks.Data.Json.Succinct.Cursor.Internal
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
data JsonCursorType
= JsonCursorArray
| JsonCursorBool
| JsonCursorNull
| JsonCursorNumber
| JsonCursorObject
| JsonCursorString
deriving (Eq, Show)
class HasJsonCursorType k where
jsonCursorType :: k -> Maybe JsonCursorType
jsonCursorType' :: Char -> Maybe JsonCursorType
jsonCursorType' c = case c of
'[' -> Just JsonCursorArray
't' -> Just JsonCursorBool
'f' -> Just JsonCursorBool
'0' -> Just JsonCursorNumber
'1' -> Just JsonCursorNumber
'2' -> Just JsonCursorNumber
'3' -> Just JsonCursorNumber
'4' -> Just JsonCursorNumber
'5' -> Just JsonCursorNumber
'6' -> Just JsonCursorNumber
'7' -> Just JsonCursorNumber
'8' -> Just JsonCursorNumber
'9' -> Just JsonCursorNumber
'+' -> Just JsonCursorNumber
'-' -> Just JsonCursorNumber
'n' -> Just JsonCursorNull
'{' -> Just JsonCursorObject
'"' -> Just JsonCursorString
_ -> Nothing
jsonCursorPos :: (Rank1 w, Select1 v, VectorLike s) => JsonCursor s v w -> Position
jsonCursorPos k = toPosition (select1 ik (rank1 bpk (cursorRank k)) 1)
where ik = interests k
bpk = balancedParens k
jsonCursorElemAt :: (Rank1 w, Select1 v, VectorLike s) => JsonCursor s v w -> Elem s
jsonCursorElemAt k = cursorText k !!! jsonCursorPos k
instance (Rank1 i, Select1 i, Rank1 b) => HasJsonCursorType (JsonCursor String i b) where
jsonCursorType = jsonCursorType' . jsonCursorElemAt
instance (Rank1 i, Select1 i, Rank1 b) => HasJsonCursorType (JsonCursor BS.ByteString i b) where
jsonCursorType = jsonCursorType' . chr . fromIntegral . jsonCursorElemAt