hw-json-standard-cursor 0.2.0.0 → 0.2.1.0
raw patch · 3 files changed
+41/−8 lines, 3 filesdep ~hw-primPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hw-prim
API changes (from Hackage documentation)
+ HaskellWorks.Data.Json.Standard.Cursor.Fast: fromBsIbBp :: ByteString -> IbBp -> Cursor
+ HaskellWorks.Data.Json.Standard.Cursor.Fast: simdToIbBp :: ByteString -> IbBp
+ HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp: simdToIbBp :: ByteString -> IbBp
Files
- hw-json-standard-cursor.cabal +3/−2
- src/HaskellWorks/Data/Json/Standard/Cursor/Fast.hs +11/−5
- src/HaskellWorks/Data/Json/Standard/Cursor/Internal/IbBp.hs +27/−1
hw-json-standard-cursor.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: hw-json-standard-cursor-version: 0.2.0.0+version: 0.2.1.0 synopsis: Memory efficient JSON parser description: Memory efficient JSON parser. Please see README.md category: Data@@ -51,7 +51,7 @@ 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-prim { build-depends: hw-prim >= 0.6.2.28 && < 0.7 }+common hw-prim { build-depends: hw-prim >= 0.6.2.29 && < 0.7 } common hw-rankselect { build-depends: hw-rankselect >= 0.13 && < 0.14 } common hw-rankselect-base { build-depends: hw-rankselect-base >= 0.3.2.1 && < 0.4 } common lens { build-depends: lens >= 4 && < 5 }@@ -79,6 +79,7 @@ , bytestring , hw-balancedparens , hw-bits+ , hw-json-simd , hw-prim , hw-rankselect , hw-rankselect-base
src/HaskellWorks/Data/Json/Standard/Cursor/Fast.hs view
@@ -5,10 +5,13 @@ , fromByteString , fromForeignRegion , fromString+ , fromBsIbBp+ , simdToIbBp ) where import Foreign.ForeignPtr import HaskellWorks.Data.Json.Standard.Cursor.Generic+import HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp import HaskellWorks.Data.Json.Standard.Cursor.Specific import HaskellWorks.Data.RankSelect.CsPoppy1 @@ -26,14 +29,17 @@ type Cursor = GenericCursor BS.ByteString CsPoppy1 (RM.RangeMin CsPoppy1) -fromByteString :: BS.ByteString -> Cursor-fromByteString bs = GenericCursor+fromBsIbBp :: BS.ByteString -> IbBp -> Cursor+fromBsIbBp bs ibBp = GenericCursor { cursorText = bs- , interests = makeCsPoppy ib- , balancedParens = RM.mkRangeMin (makeCsPoppy bp)+ , interests = makeCsPoppy ibPart+ , balancedParens = RM.mkRangeMin (makeCsPoppy bpPart) , cursorRank = 1 }- where J.IbBp ib bp = J.slowToIbBp bs+ where J.IbBp ibPart bpPart = ibBp++fromByteString :: BS.ByteString -> Cursor+fromByteString bs = fromBsIbBp bs (J.slowToIbBp bs) fromForeignRegion :: F.ForeignRegion -> Cursor fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)
src/HaskellWorks/Data/Json/Standard/Cursor/Internal/IbBp.hs view
@@ -1,12 +1,25 @@-module HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp where+{-# LANGUAGE BangPatterns #-} +module HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp+ ( IbBp(..)+ , slowToIbBp+ , simdToIbBp) where++import Control.Monad+import Control.Monad.ST (ST) import Data.Word+import HaskellWorks.Data.Vector.AsVector64 import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS import qualified Data.Vector.Storable as DVS+import qualified Data.Vector.Storable.Mutable as DVSM+import qualified HaskellWorks.Data.ByteString.Lazy as LBS+import qualified HaskellWorks.Data.Json.Simd.Index.Standard as STSI import qualified HaskellWorks.Data.Json.Standard.Cursor.Internal.BlankedJson as J import qualified HaskellWorks.Data.Json.Standard.Cursor.Internal.ToBalancedParens64 as J import qualified HaskellWorks.Data.Json.Standard.Cursor.Internal.ToInterestBits64 as J+import qualified HaskellWorks.Data.Vector.Storable as DVS data IbBp = IbBp { ib :: DVS.Vector Word64@@ -19,3 +32,16 @@ , bp = J.toBalancedParens64 blankedJson } where blankedJson = J.toBlankedJsonTyped bs++simdToIbBp :: BS.ByteString -> IbBp+simdToIbBp bs = case STSI.makeStandardJsonIbBps (LBS.rechunkPadded chunkSize (LBS.fromStrict bs)) of+ Left msg -> error msg+ Right chunks -> uncurry IbBp $ DVS.construct2N maxSize (go . fst) maxSize (go . snd) chunks+ where chunkSize = 16384+ maxSize = (BS.length bs + chunkSize - 1) `div` 8+ go :: BS.ByteString -> DVSM.MVector s Word64 -> ST s Int+ go bytes mv = do+ let source = asVector64 bytes+ let target = DVSM.take (DVS.length source) mv+ when (DVS.length source > 0) $ DVS.copy target source+ return (DVS.length source)