hw-json-1.0.0.0: src/HaskellWorks/Data/Json/Backend/Simple/Value.hs
module HaskellWorks.Data.Json.Backend.Simple.Value where
import Data.Maybe
import Data.Word
import HaskellWorks.Data.Json.Backend.Simple.Cursor
import HaskellWorks.Data.Positioning
import HaskellWorks.Data.RankSelect.Base.Select1
import HaskellWorks.Data.RankSelect.Poppy512
import qualified Data.ByteString as BS
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.BalancedParens as BP
data JsonValue
= JsonValues JsonValues
| JsonNull
| JsonNumber Double
| JsonString String
| JsonBoolean Bool
deriving (Eq, Show)
data JsonValues
= JsonArray [JsonValue]
| JsonObject [(String, JsonValue)]
deriving (Eq, Show)
snippetPos :: JsonCursor BS.ByteString Poppy512 (BP.SimpleBalancedParens (DVS.Vector Word64)) -> (Count, Count)
snippetPos k = (kpa, kpz)
where kpa = select1 kib kta + km
kpz = select1 kib ktz - km
kib = interests k
kbp = balancedParens k
kra = cursorRank k
krz = fromMaybe maxBound (BP.findClose kbp kra)
ksa = kra + 1
ksz = krz + 1
kta = ksa `div` 2
ktz = ksz `div` 2
km = ksa `mod` 2
snippet :: JsonCursor BS.ByteString Poppy512 (BP.SimpleBalancedParens (DVS.Vector Word64)) -> BS.ByteString
snippet k = let (a, z) = snippetPos k in BS.take (fromIntegral (z - a + 1)) (BS.drop (fromIntegral (a - 1)) kt)
where kt = cursorText k