packages feed

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 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)