module HaskellWorks.Data.Json.Type
( JsonType(..)
, JsonTypeAt(..)
) where
import qualified Data.ByteString as BS
import Data.Char
import Data.Word8
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Drop
import HaskellWorks.Data.Json.Succinct
import HaskellWorks.Data.Positioning
import HaskellWorks.Data.RankSelect.Base.Rank0
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import qualified HaskellWorks.Data.Succinct.BalancedParens as BP
import Prelude hiding (drop)
wIsJsonNumberDigit :: Word8 -> Bool
wIsJsonNumberDigit w = (w >= _0 && w <= _9) || w == _hyphen
data JsonType
= JsonTypeArray
| JsonTypeBool
| JsonTypeNull
| JsonTypeNumber
| JsonTypeObject
| JsonTypeString
deriving (Eq, Show)
class JsonTypeAt a where
jsonTypeAtPosition :: Position -> a -> Maybe JsonType
jsonTypeAt :: a -> Maybe JsonType
instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => JsonTypeAt (JsonCursor String v w) where
jsonTypeAtPosition p k = case drop (toCount p) (cursorText k) of
c:_ | fromIntegral (ord c) == _bracketleft -> Just JsonTypeArray
c:_ | fromIntegral (ord c) == _f -> Just JsonTypeBool
c:_ | fromIntegral (ord c) == _t -> Just JsonTypeBool
c:_ | fromIntegral (ord c) == _n -> Just JsonTypeNull
c:_ | wIsJsonNumberDigit (fromIntegral (ord c)) -> Just JsonTypeNumber
c:_ | fromIntegral (ord c) == _braceleft -> Just JsonTypeObject
c:_ | fromIntegral (ord c) == _quotedbl -> Just JsonTypeString
_ -> Nothing
jsonTypeAt k = jsonTypeAtPosition p k
where p = lastPositionOf (select1 ik (rank1 bpk (cursorRank k)))
ik = interests k
bpk = balancedParens k
instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => JsonTypeAt (JsonCursor BS.ByteString v w) where
jsonTypeAtPosition p k = case BS.uncons (drop (toCount p) (cursorText k)) of
Just (c, _) | c == _bracketleft -> Just JsonTypeArray
Just (c, _) | c == _f -> Just JsonTypeBool
Just (c, _) | c == _t -> Just JsonTypeBool
Just (c, _) | c == _n -> Just JsonTypeNull
Just (c, _) | wIsJsonNumberDigit c -> Just JsonTypeNumber
Just (c, _) | c == _braceleft -> Just JsonTypeObject
Just (c, _) | c == _quotedbl -> Just JsonTypeString
_ -> Nothing
jsonTypeAt k = jsonTypeAtPosition p k
where p = lastPositionOf (select1 ik (rank1 bpk (cursorRank k)))
ik = interests k
bpk = balancedParens k