hw-json 1.2.0.0 → 1.2.0.1
raw patch · 7 files changed
+6/−326 lines, 7 filesdep +hw-json-simple-cursordep ~hw-json-standard-cursorPVP ok
version bump matches the API change (PVP)
Dependencies added: hw-json-simple-cursor
Dependency ranges changed: hw-json-standard-cursor
API changes (from Hackage documentation)
Files
- hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor.hs +0/−90
- hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Fast.hs +0/−35
- hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Internal/IbBp.hs +0/−10
- hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Internal/ToIbBp.hs +0/−12
- hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Internal/Word8.hs +0/−72
- hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/SemiIndex.hs +0/−80
- hw-json.cabal +6/−27
− hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor.hs
@@ -1,90 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE InstanceSigs #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}--module HaskellWorks.Data.Json.Simple.Cursor- ( JsonCursor(..)- , jsonCursorPos- ) where--import Data.String-import Data.Word-import HaskellWorks.Data.FromByteString-import HaskellWorks.Data.FromForeignRegion-import HaskellWorks.Data.Positioning-import HaskellWorks.Data.RankSelect.Base.Rank0-import HaskellWorks.Data.RankSelect.Base.Rank1-import HaskellWorks.Data.RankSelect.Base.Select1-import HaskellWorks.Data.RankSelect.CsPoppy-import HaskellWorks.Data.TreeCursor-import Prelude hiding (drop)--import qualified Data.ByteString as BS-import qualified Data.ByteString.Char8 as BSC-import qualified Data.ByteString.Internal as BSI-import qualified Data.Vector.Storable as DVS-import qualified Foreign.ForeignPtr as F-import qualified HaskellWorks.Data.BalancedParens as BP-import qualified HaskellWorks.Data.BalancedParens.RangeMin as RM-import qualified HaskellWorks.Data.Json.Simple.Cursor.SemiIndex as SI--data JsonCursor t v w = JsonCursor- { cursorText :: !t- , interests :: !v- , balancedParens :: !w- , cursorRank :: !Count- }- deriving (Eq, Show)--instance FromByteString (JsonCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64))) where- fromByteString bs = JsonCursor- { cursorText = bs- , interests = ib- , balancedParens = BP.SimpleBalancedParens bp- , cursorRank = 1- }- where SI.SemiIndex _ ib bp = SI.buildSemiIndex bs--instance FromByteString (JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)) where- fromByteString bs = JsonCursor- { cursorText = bs- , interests = makeCsPoppy ib- , balancedParens = RM.mkRangeMin (makeCsPoppy bp)- , cursorRank = 1- }- where SI.SemiIndex _ ib bp = SI.buildSemiIndex bs--instance FromForeignRegion (JsonCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64))) where- fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (F.castForeignPtr fptr) offset size)--instance FromForeignRegion (JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)) where- fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (F.castForeignPtr fptr) offset size)--instance IsString (JsonCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64))) where- fromString = fromByteString . BSC.pack--instance IsString (JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)) where- fromString = fromByteString . BSC.pack--instance (BP.BalancedParens u, Rank1 u, Rank0 u) => TreeCursor (JsonCursor t v u) where- firstChild :: JsonCursor t v u -> Maybe (JsonCursor t v u)- firstChild k = let mq = BP.firstChild (balancedParens k) (cursorRank k) in (\q -> k { cursorRank = q }) <$> mq-- nextSibling :: JsonCursor t v u -> Maybe (JsonCursor t v u)- nextSibling k = (\q -> k { cursorRank = q }) <$> BP.nextSibling (balancedParens k) (cursorRank k)-- parent :: JsonCursor t v u -> Maybe (JsonCursor t v u)- parent k = let mq = BP.parent (balancedParens k) (cursorRank k) in (\q -> k { cursorRank = q }) <$> mq-- depth :: JsonCursor t v u -> Maybe Count- depth k = BP.depth (balancedParens k) (cursorRank k)-- subtreeSize :: JsonCursor t v u -> Maybe Count- subtreeSize k = BP.subtreeSize (balancedParens k) (cursorRank k)--jsonCursorPos :: (Rank1 w, Select1 v) => JsonCursor s v w -> Position-jsonCursorPos k = toPosition (select1 ik (rank1 bpk (cursorRank k)) - 1)- where ik = interests k- bpk = balancedParens k
− hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Fast.hs
@@ -1,35 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TypeSynonymInstances #-}--module HaskellWorks.Data.Json.Simple.Cursor.Fast- ( fromByteString- , fromForeignRegion- , fromString- ) where--import Foreign.ForeignPtr-import HaskellWorks.Data.Json.Simple.Cursor-import HaskellWorks.Data.RankSelect.CsPoppy--import qualified Data.ByteString as BS-import qualified Data.ByteString.Char8 as BSC-import qualified Data.ByteString.Internal as BSI-import qualified HaskellWorks.Data.BalancedParens.RangeMin as RM-import qualified HaskellWorks.Data.FromForeignRegion as F-import qualified HaskellWorks.Data.Json.Simple.Cursor.Internal.IbBp as J-import qualified HaskellWorks.Data.Json.Simple.Cursor.Internal.ToIbBp as J--fromByteString :: BS.ByteString -> JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)-fromByteString bs = JsonCursor- { cursorText = bs- , interests = makeCsPoppy ib- , balancedParens = RM.mkRangeMin (makeCsPoppy bp)- , cursorRank = 1- }- where J.IbBp ib bp = J.toIbBp bs--fromForeignRegion :: F.ForeignRegion -> JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)-fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)--fromString :: String -> JsonCursor BS.ByteString CsPoppy (RM.RangeMin CsPoppy)-fromString = fromByteString . BSC.pack
− hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Internal/IbBp.hs
@@ -1,10 +0,0 @@-module HaskellWorks.Data.Json.Simple.Cursor.Internal.IbBp where--import Data.Word--import qualified Data.Vector.Storable as DVS--data IbBp = IbBp- { ib :: DVS.Vector Word64- , bp :: DVS.Vector Word64- }
− hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Internal/ToIbBp.hs
@@ -1,12 +0,0 @@-module HaskellWorks.Data.Json.Simple.Cursor.Internal.ToIbBp where--import qualified Data.ByteString as BS-import qualified HaskellWorks.Data.Json.Simple.Cursor.Internal.IbBp as Z-import qualified HaskellWorks.Data.Json.Simple.Cursor.SemiIndex as J--class ToIbBp a where- toIbBp :: a -> Z.IbBp--instance ToIbBp BS.ByteString where- toIbBp bs = Z.IbBp ib bp- where J.SemiIndex _ ib bp = J.buildSemiIndex bs
− hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/Internal/Word8.hs
@@ -1,72 +0,0 @@-module HaskellWorks.Data.Json.Simple.Cursor.Internal.Word8 where--import Data.Word-import Data.Word8 hiding (isDigit)--import qualified Data.Char as C--isLeadingDigit :: Word8 -> Bool-isLeadingDigit w = w == _hyphen || (w >= _0 && w <= _9)--isTrailingDigit :: Word8 -> Bool-isTrailingDigit w = w == _plus || w == _hyphen || (w >= _0 && w <= _9) || w == _period || w == _E || w == _e--isAlphabetic :: Word8 -> Bool-isAlphabetic w = (w >= _A && w <= _Z) || (w >= _a && w <= _z)--isDigit :: Word8 -> Bool-isDigit w = w >= _0 && w <= _9--wIsJsonNumberDigit :: Word8 -> Bool-wIsJsonNumberDigit w = (w >= _0 && w <= _9) || w == _hyphen--doubleQuote :: Word8-doubleQuote = fromIntegral (C.ord '"')--backSlash :: Word8-backSlash = fromIntegral (C.ord '\\')--openBrace :: Word8-openBrace = fromIntegral (C.ord '{')--closeBrace :: Word8-closeBrace = fromIntegral (C.ord '}')--openBracket :: Word8-openBracket = fromIntegral (C.ord '[')--closeBracket :: Word8-closeBracket = fromIntegral (C.ord ']')--comma :: Word8-comma = fromIntegral (C.ord ',')--colon :: Word8-colon = fromIntegral (C.ord ':')--isPeriod :: Word8 -> Bool-isPeriod w = w == 46--isMinus :: Word8 -> Bool-isMinus w = w == 45--isPlus :: Word8 -> Bool-isPlus w = w == 43--isValueChar :: Word8 -> Bool-isValueChar c = isAlphabetic c || isDigit c || isPeriod c || isMinus c || isPlus c--isOpen :: Word8 -> Bool-isOpen c = c == openBracket || c == openBrace--isClose :: Word8 -> Bool-isClose c = c == closeBracket || c == closeBrace--isDelim :: Word8 -> Bool-isDelim c = c == comma || c == colon--isDoubleQuote :: Word8 -> Bool-isDoubleQuote c = c == doubleQuote--isBackSlash :: Word8 -> Bool-isBackSlash c = c == backSlash
− hw-json-simple-cursor/HaskellWorks/Data/Json/Simple/Cursor/SemiIndex.hs
@@ -1,80 +0,0 @@-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveTraversable #-}-{-# LANGUAGE InstanceSigs #-}-{-# LANGUAGE MultiWayIf #-}--module HaskellWorks.Data.Json.Simple.Cursor.SemiIndex- ( buildSemiIndex- , SemiIndex(..)- ) where--import Control.Monad.ST-import Data.Word--import qualified Data.ByteString as BS-import qualified Data.ByteString.Unsafe as BSU-import qualified Data.Vector.Storable as DVS-import qualified HaskellWorks.Data.Bits.Writer.Storable as W-import qualified HaskellWorks.Data.Json.Simple.Cursor.Internal.Word8 as W8--{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}-{-# ANN module ("HLint: ignore Redundant do" :: String) #-}--data Context = InJson | InString | InEscape deriving (Eq, Show)--data SemiIndex v = SemiIndex- { semiIndexContext :: !Context- , semiIndexIb :: !v- , semiIndexBp :: !v- } deriving (Functor, Traversable, Foldable)--buildSemiIndex :: BS.ByteString -> SemiIndex (DVS.Vector Word64)-buildSemiIndex bs = DVS.createT $ do- let len = (BS.length bs + 7) `div` 8- mib <- W.newWriter len- mbp <- W.newWriter (len * 2)- buildFromByteString mib mbp bs 0 InJson-{-# INLINE buildSemiIndex #-}--buildFromByteString :: W.Writer s -> W.Writer s -> BS.ByteString -> Int -> Context -> ST s (SemiIndex (DVS.MVector s Word64))-buildFromByteString ib bp bs i context = if i < BS.length bs- then do- let c = BSU.unsafeIndex bs i- case context of- InJson -> if- | c == W8.openBracket || c == W8.openBrace -> do- W.unsafeWriteBit bp 1- W.unsafeWriteBit bp 1- W.unsafeWriteBit ib 1- buildFromByteString ib bp bs (i + 1) InJson- | c == W8.closeBracket || c == W8.closeBrace -> do- W.unsafeWriteBit bp 0- W.unsafeWriteBit bp 0- W.unsafeWriteBit ib 1- buildFromByteString ib bp bs (i + 1) InJson- | c == W8.comma || c == W8.colon -> do- W.unsafeWriteBit bp 0- W.unsafeWriteBit bp 1- W.unsafeWriteBit ib 1- buildFromByteString ib bp bs (i + 1) InJson- | c == W8.doubleQuote -> do- W.unsafeWriteBit ib 0- buildFromByteString ib bp bs (i + 1) InString- | otherwise -> do- W.unsafeWriteBit ib 0- buildFromByteString ib bp bs (i + 1) InJson- InString -> do- W.unsafeWriteBit ib 0- let newContext = if- | c == W8.doubleQuote -> InJson- | c == W8.backSlash -> InEscape- | otherwise -> InString- buildFromByteString ib bp bs (i + 1) newContext- InEscape -> do- W.unsafeWriteBit ib 0- buildFromByteString ib bp bs (i + 1) InString- else do- ibv <- W.written ib- bpv <- W.written bp- return (SemiIndex context ibv bpv)-{-# INLINE buildFromByteString #-}
hw-json.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: hw-json-version: 1.2.0.0+version: 1.2.0.1 synopsis: Memory efficient JSON parser description: Memory efficient JSON parser. Please see README.md category: Data@@ -54,7 +54,8 @@ common hw-bits { build-depends: hw-bits >= 0.7.0.5 && < 0.8 } common hw-hspec-hedgehog { build-depends: hw-hspec-hedgehog >= 0.1.0.4 && < 0.2 } common hw-json-simd { build-depends: hw-json-simd >= 0.1.0.2 && < 0.2 }-common hw-json-standard-cursor { build-depends: hw-json-standard-cursor >= 0.1.0.0 && < 0.2 }+common hw-json-simple-cursor { build-depends: hw-json-simple-cursor >= 0.1.0.1 && < 0.2 }+common hw-json-standard-cursor { build-depends: hw-json-standard-cursor >= 0.1.0.1 && < 0.2 } common hw-mquery { build-depends: hw-mquery >= 0.2.0.0 && < 0.3 } common hw-parser { build-depends: hw-parser >= 0.1 && < 0.2 } common hw-prim { build-depends: hw-prim >= 0.6.2.28 && < 0.7 }@@ -80,24 +81,6 @@ ghc-options: -mbmi2 -msse4.2 cpp-options: -DBMI2_ENABLED -library hw-json-simple-cursor- import: base, config- , bytestring- , hw-balancedparens- , hw-bits- , hw-prim- , hw-rankselect- , hw-rankselect-base- , vector- , word8- hs-source-dirs: hw-json-simple-cursor- exposed-modules: HaskellWorks.Data.Json.Simple.Cursor- HaskellWorks.Data.Json.Simple.Cursor.Fast- HaskellWorks.Data.Json.Simple.Cursor.SemiIndex- HaskellWorks.Data.Json.Simple.Cursor.Internal.IbBp- HaskellWorks.Data.Json.Simple.Cursor.Internal.ToIbBp- HaskellWorks.Data.Json.Simple.Cursor.Internal.Word8- library import: base, config , ansi-wl-pprint@@ -107,6 +90,7 @@ , dlist , hw-balancedparens , hw-bits+ , hw-json-simple-cursor , hw-json-standard-cursor , hw-mquery , hw-parser@@ -122,7 +106,6 @@ hs-source-dirs: src other-modules: Paths_hw_json autogen-modules: Paths_hw_json- build-depends: hw-json-simple-cursor exposed-modules: HaskellWorks.Data.Json.DecodeError HaskellWorks.Data.Json.FromValue@@ -144,12 +127,6 @@ HaskellWorks.Data.Json.Simple.Value HaskellWorks.Data.Json.Standard.Load.Partial HaskellWorks.Data.Json.Value- reexported-modules:- HaskellWorks.Data.Json.Simple.Cursor- , HaskellWorks.Data.Json.Simple.Cursor.Fast- , HaskellWorks.Data.Json.Simple.Cursor.SemiIndex- , HaskellWorks.Data.Json.Simple.Cursor.Internal.IbBp- , HaskellWorks.Data.Json.Simple.Cursor.Internal.ToIbBp executable hw-json import: base, config@@ -158,6 +135,7 @@ , generic-lens , hw-balancedparens , hw-json-simd+ , hw-json-simple-cursor , hw-json-standard-cursor , hw-mquery , hw-prim@@ -189,6 +167,7 @@ , hw-balancedparens , hw-bits , hw-hspec-hedgehog+ , hw-json-simple-cursor , hw-json-standard-cursor , hw-prim , hw-rankselect