hw-json-standard-cursor 0.2.2.0 → 0.2.3.0
raw patch · 5 files changed
+79/−74 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp: IbBp :: Vector Word64 -> Vector Word64 -> IbBp
- HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp: [bp] :: IbBp -> Vector Word64
- HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp: [ib] :: IbBp -> Vector Word64
- HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp: data IbBp
- HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp: simdToIbBp :: ByteString -> IbBp
- HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp: slowToIbBp :: ByteString -> IbBp
+ HaskellWorks.Data.Json.Standard.Cursor.IbBp: IbBp :: Vector Word64 -> Vector Word64 -> IbBp
+ HaskellWorks.Data.Json.Standard.Cursor.IbBp: [bp] :: IbBp -> Vector Word64
+ HaskellWorks.Data.Json.Standard.Cursor.IbBp: [ib] :: IbBp -> Vector Word64
+ HaskellWorks.Data.Json.Standard.Cursor.IbBp: data IbBp
+ HaskellWorks.Data.Json.Standard.Cursor.IbBp: simdToIbBp :: ByteString -> IbBp
+ HaskellWorks.Data.Json.Standard.Cursor.IbBp: slowToIbBp :: ByteString -> IbBp
+ HaskellWorks.Data.Json.Standard.Cursor.Slow: fromBsIbBp :: ByteString -> IbBp -> Cursor
Files
- hw-json-standard-cursor.cabal +6/−6
- src/HaskellWorks/Data/Json/Standard/Cursor/Fast.hs +7/−7
- src/HaskellWorks/Data/Json/Standard/Cursor/IbBp.hs +47/−0
- src/HaskellWorks/Data/Json/Standard/Cursor/Internal/IbBp.hs +0/−47
- src/HaskellWorks/Data/Json/Standard/Cursor/Slow.hs +19/−14
hw-json-standard-cursor.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: hw-json-standard-cursor-version: 0.2.2.0+version: 0.2.3.0 synopsis: Memory efficient JSON parser description: Memory efficient JSON parser. Please see README.md category: Data@@ -46,10 +46,10 @@ common directory { build-depends: directory >= 1.3 && < 1.4 } common doctest { build-depends: doctest >= 0.16.2 && < 0.17 } common doctest-discover { build-depends: doctest-discover >= 0.2 && < 0.3 }-common generic-lens { build-depends: generic-lens >= 1.1.0.0 && < 1.3 }+common generic-lens { build-depends: generic-lens >= 1.1.0.0 && < 2.1 } common hedgehog { build-depends: hedgehog >= 0.6 && < 1.1 } common hspec { build-depends: hspec >= 2.4 && < 3 }-common hw-balancedparens { build-depends: hw-balancedparens >= 0.3.0.0 && < 0.4 }+common hw-balancedparens { build-depends: hw-balancedparens >= 0.3.0.0 && < 0.5 } 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 }@@ -92,10 +92,10 @@ exposed-modules: HaskellWorks.Data.Json.Standard.Cursor HaskellWorks.Data.Json.Standard.Cursor.Fast HaskellWorks.Data.Json.Standard.Cursor.Generic+ HaskellWorks.Data.Json.Standard.Cursor.IbBp HaskellWorks.Data.Json.Standard.Cursor.Index HaskellWorks.Data.Json.Standard.Cursor.Internal.Blank HaskellWorks.Data.Json.Standard.Cursor.Internal.BlankedJson- HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp HaskellWorks.Data.Json.Standard.Cursor.Internal.MakeIndex HaskellWorks.Data.Json.Standard.Cursor.Internal.StateMachine HaskellWorks.Data.Json.Standard.Cursor.Internal.ToBalancedParens64@@ -167,14 +167,14 @@ hs-source-dirs: bench build-depends: hw-json-standard-cursor -test-suite hw-json-standard-cursor-doctest+test-suite doctest import: base, config , doctest , doctest-discover , bits-extra default-language: Haskell2010 type: exitcode-stdio-1.0- ghc-options: -threaded+ ghc-options: -threaded -rtsopts -with-rtsopts=-N main-is: DoctestDriver.hs HS-Source-Dirs: doctest build-tool-depends: doctest-discover:doctest-discover
src/HaskellWorks/Data/Json/Standard/Cursor/Fast.hs view
@@ -13,16 +13,16 @@ import Foreign.ForeignPtr import HaskellWorks.Data.Json.Standard.Cursor.Generic-import HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp+import HaskellWorks.Data.Json.Standard.Cursor.IbBp import HaskellWorks.Data.Json.Standard.Cursor.Specific import HaskellWorks.Data.RankSelect.CsPoppy1 -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.Standard.Cursor.Internal.IbBp as J+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.Standard.Cursor.IbBp as J data Fast
+ src/HaskellWorks/Data/Json/Standard/Cursor/IbBp.hs view
@@ -0,0 +1,47 @@+{-# LANGUAGE BangPatterns #-}++module HaskellWorks.Data.Json.Standard.Cursor.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+ , bp :: DVS.Vector Word64+ }++slowToIbBp :: BS.ByteString -> IbBp+slowToIbBp bs = IbBp+ { ib = J.toInterestBits64 blankedJson+ , 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)
− src/HaskellWorks/Data/Json/Standard/Cursor/Internal/IbBp.hs
@@ -1,47 +0,0 @@-{-# 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- , bp :: DVS.Vector Word64- }--slowToIbBp :: BS.ByteString -> IbBp-slowToIbBp bs = IbBp- { ib = J.toInterestBits64 blankedJson- , 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)
src/HaskellWorks/Data/Json/Standard/Cursor/Slow.hs view
@@ -2,6 +2,7 @@ module HaskellWorks.Data.Json.Standard.Cursor.Slow ( Cursor+ , fromBsIbBp , fromByteString , fromForeignRegion , fromString@@ -10,15 +11,16 @@ import Data.Word import Foreign.ForeignPtr import HaskellWorks.Data.Json.Standard.Cursor.Generic+import HaskellWorks.Data.Json.Standard.Cursor.IbBp import HaskellWorks.Data.Json.Standard.Cursor.Specific -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 HaskellWorks.Data.BalancedParens as BP-import qualified HaskellWorks.Data.FromForeignRegion as F-import qualified HaskellWorks.Data.Json.Standard.Cursor.Internal.IbBp as J+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 HaskellWorks.Data.BalancedParens as BP+import qualified HaskellWorks.Data.FromForeignRegion as F+import qualified HaskellWorks.Data.Json.Standard.Cursor.IbBp as J data Slow @@ -27,14 +29,17 @@ type Cursor = GenericCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64)) +fromBsIbBp :: BS.ByteString -> IbBp -> Cursor+fromBsIbBp bs ibBp = GenericCursor+ { cursorText = bs+ , interests = ibPart+ , balancedParens = BP.SimpleBalancedParens bpPart+ , cursorRank = 1+ }+ where J.IbBp ibPart bpPart = ibBp+ fromByteString :: BS.ByteString -> Cursor-fromByteString bs = GenericCursor- { cursorText = bs- , interests = ib- , balancedParens = BP.SimpleBalancedParens bp- , cursorRank = 1- }- where J.IbBp ib bp = J.slowToIbBp bs+fromByteString bs = fromBsIbBp bs (J.slowToIbBp bs) fromForeignRegion :: F.ForeignRegion -> Cursor fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)