hw-json-standard-cursor 0.2.1.2 → 0.2.1.3
raw patch · 4 files changed
+92/−68 lines, 4 filesdep +doctestdep +doctest-discoverPVP ok
version bump matches the API change (PVP)
Dependencies added: doctest, doctest-discover
API changes (from Hackage documentation)
Files
- doctest/DoctestDriver.hs +12/−0
- hw-json-standard-cursor.cabal +42/−29
- src/HaskellWorks/Data/Json/Standard/Cursor/Internal/StateMachine.hs +29/−30
- src/HaskellWorks/Data/Json/Standard/Cursor/SemiIndex.hs +9/−9
+ doctest/DoctestDriver.hs view
@@ -0,0 +1,12 @@+{-# LANGUAGE CPP #-}++#if MIN_VERSION_GLASGOW_HASKELL(8,4,4,0)+{-# OPTIONS_GHC -F -pgmF doctest-discover #-}+#else+module Main where++import qualified System.IO as IO++main :: IO ()+main = IO.putStrLn "WARNING: doctest will not run on GHC versions earlier than 8.4.4"+#endif
hw-json-standard-cursor.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: hw-json-standard-cursor-version: 0.2.1.2+version: 0.2.1.3 synopsis: Memory efficient JSON parser description: Memory efficient JSON parser. Please see README.md category: Data@@ -37,40 +37,42 @@ manual: False default: False -common base { build-depends: base >= 4 && < 5 }+common base { build-depends: base >= 4 && < 5 } -common array { build-depends: array >= 0.5 && < 0.6 }-common bits-extra { build-depends: bits-extra >= 0.0.1.3 && < 0.1 }-common bytestring { build-depends: bytestring >= 0.10.6 && < 0.11 }-common criterion { build-depends: criterion >= 1.4 && < 1.6 }-common directory { build-depends: directory >= 1.3 && < 1.4 }-common generic-lens { build-depends: generic-lens >= 1.1.0.0 && < 1.3 }-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-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.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 }-common mmap { build-depends: mmap >= 0.5 && < 0.6 }-common optparse-applicative { build-depends: optparse-applicative >= 0.14 && < 0.16 }-common text { build-depends: text >= 1.2 && < 1.3 }-common vector { build-depends: vector >= 0.12 && < 0.13 }-common word8 { build-depends: word8 >= 0.1 && < 0.2 }+common array { build-depends: array >= 0.5 && < 0.6 }+common bits-extra { build-depends: bits-extra >= 0.0.1.3 && < 0.1 }+common bytestring { build-depends: bytestring >= 0.10.6 && < 0.11 }+common criterion { build-depends: criterion >= 1.4 && < 1.6 }+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 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-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.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 }+common mmap { build-depends: mmap >= 0.5 && < 0.6 }+common optparse-applicative { build-depends: optparse-applicative >= 0.14 && < 0.16 }+common text { build-depends: text >= 1.2 && < 1.3 }+common vector { build-depends: vector >= 0.12 && < 0.13 }+common word8 { build-depends: word8 >= 0.1 && < 0.2 } common semigroups { if impl(ghc < 8 ) { build-depends: semigroups >= 0.16 && < 0.19 } } common config- default-language: Haskell2010- ghc-options: -Wall -O2 -msse4.2+ default-language: Haskell2010+ ghc-options: -Wall -O2 -msse4.2 if flag(sse42)- ghc-options: -msse4.2+ ghc-options: -msse4.2 if flag(bmi2) && impl(ghc >= 8.4.1)- ghc-options: -mbmi2 -msse4.2- cpp-options: -DBMI2_ENABLED+ ghc-options: -mbmi2 -msse4.2+ cpp-options: -DBMI2_ENABLED library import: base, config@@ -168,4 +170,15 @@ main-is: Main.hs hs-source-dirs: bench build-depends: hw-json-standard-cursor- other-modules: Paths_hw_json_standard_cursor++test-suite hw-json-standard-cursor-doctest+ import: base, config+ , doctest+ , doctest-discover+ , bits-extra+ default-language: Haskell2010+ type: exitcode-stdio-1.0+ ghc-options: -threaded+ main-is: DoctestDriver.hs+ HS-Source-Dirs: doctest+ build-tool-depends: doctest-discover:doctest-discover
src/HaskellWorks/Data/Json/Standard/Cursor/Internal/StateMachine.hs view
@@ -27,21 +27,20 @@ data State = InJson | InString | InEscape | InValue deriving (Eq, Enum, Bounded, Show) phiTable :: DV.Vector (DVS.Vector Word8)-phiTable = DV.constructN 5 gos- where gos :: DV.Vector (DVS.Vector Word8) -> DVS.Vector Word8- gos v = DVS.constructN 256 go- where vi = DV.length v- go :: DVS.Vector Word8 -> Word8- go u = fromIntegral (snd (stateMachine (fromIntegral ui) (toEnum vi)))- where ui = DVS.length u+phiTable = DV.generate 5 gos+ where gos :: Int -> DVS.Vector Word8+ gos vj = DVS.generate 256 go+ where vi = fromIntegral vj+ go :: Int -> Word8+ go uj = fromIntegral (snd (stateMachine (fromIntegral uj) (toEnum vi))) {-# NOINLINE phiTable #-} phiTable2 :: DVS.Vector Word8-phiTable2 = DVS.constructN (4 * fromIntegral iLen) go+phiTable2 = DVS.generate (4 * fromIntegral iLen) go where iLen = 256 :: Int- go :: DVS.Vector Word8 -> Word8- go u = fromIntegral (snd (stateMachine (fromIntegral ui) (toEnum (fromIntegral uj))))- where (uj, ui) = fromIntegral (DVS.length u) `divMod` iLen+ go :: Int -> Word8+ go uj = fromIntegral (snd (stateMachine (fromIntegral ui) (toEnum (fromIntegral uk))))+ where (uk, ui) = fromIntegral uj `divMod` iLen {-# NOINLINE phiTable2 #-} lookupPhiTable :: IntState -> Word8 -> Word8@@ -49,31 +48,31 @@ {-# INLINE lookupPhiTable #-} phiTableSimd :: DVS.Vector Word32-phiTableSimd = DVS.constructN 256 go- where go :: DVS.Vector Word32 -> Word32- go v = (snd (stateMachine vi InJson ) .<. 0) .|.+phiTableSimd = DVS.generate 256 go+ where go :: Int -> Word32+ go vj = (snd (stateMachine vi InJson ) .<. 0) .|. (snd (stateMachine vi InString) .<. 8) .|. (snd (stateMachine vi InEscape) .<. 16) .|. (snd (stateMachine vi InValue ) .<. 24)- where vi = fromIntegral (DVS.length v)+ where vi = fromIntegral vj {-# NOINLINE phiTableSimd #-} transitionTable :: DV.Vector (DVS.Vector Word8)-transitionTable = DV.constructN 5 gos- where gos :: DV.Vector (DVS.Vector Word8) -> DVS.Vector Word8- gos v = DVS.constructN 256 go- where vi = DV.length v- go :: DVS.Vector Word8 -> Word8- go u = fromIntegral (fromEnum (fst (stateMachine ui (toEnum vi))))- where ui = fromIntegral (DVS.length u)+transitionTable = DV.generate 5 gos+ where gos :: Int -> DVS.Vector Word8+ gos vj = DVS.generate 256 go+ where vi = fromIntegral vj+ go :: Int -> Word8+ go uj = fromIntegral (fromEnum (fst (stateMachine ui (toEnum vi))))+ where ui = fromIntegral uj {-# NOINLINE transitionTable #-} transitionTable2 :: DVS.Vector Word8-transitionTable2 = DVS.constructN (4 * fromIntegral iLen) go+transitionTable2 = DVS.generate (4 * fromIntegral iLen) go where iLen = 256 :: Int- go :: DVS.Vector Word8 -> Word8- go u = fromIntegral (fromEnum (fst (stateMachine (fromIntegral ui) (toEnum (fromIntegral uj)))))- where (uj, ui) = fromIntegral (DVS.length u) `divMod` iLen+ go :: Int -> Word8+ go uj = fromIntegral (fromEnum (fst (stateMachine (fromIntegral ui) (toEnum (fromIntegral uk)))))+ where (uk, ui) = fromIntegral uj `divMod` iLen {-# NOINLINE transitionTable2 #-} lookupTransitionTable :: IntState -> Word8 -> IntState@@ -81,13 +80,13 @@ {-# INLINE lookupTransitionTable #-} transitionTableSimd :: DVS.Vector Word64-transitionTableSimd = DVS.constructN 256 go- where go :: DVS.Vector Word64 -> Word64- go v = fromIntegral (fromEnum (fst (stateMachine vi InJson ))) .|.+transitionTableSimd = DVS.generate 256 go+ where go :: Int -> Word64+ go vj = fromIntegral (fromEnum (fst (stateMachine vi InJson ))) .|. fromIntegral (fromEnum (fst (stateMachine vi InString))) .|. fromIntegral (fromEnum (fst (stateMachine vi InEscape))) .|. fromIntegral (fromEnum (fst (stateMachine vi InValue )))- where vi = fromIntegral (DVS.length v)+ where vi = fromIntegral vj {-# NOINLINE transitionTableSimd #-} stateMachine :: Word8 -> State -> (State, Word32)
src/HaskellWorks/Data/Json/Standard/Cursor/SemiIndex.hs view
@@ -219,16 +219,16 @@ where makePreSiChunk :: DVS.Vector Word64 -> PreSiChunk (DVS.Vector Word64) makePreSiChunk v = PreSiChunk (makeIb v) (makeBpOp v) (makeBpCl v) makeIb :: DVS.Vector Word64 -> DVS.Vector Word64- makeIb v = asVector64 $ BS.toByteString $ DVS.constructN (DVS.length v) go- where go :: DVS.Vector Word16 -> Word16- go u = let ui = DVS.length u in fromIntegral (pext (DVS.unsafeIndex v ui) 0x4444444444444444)+ makeIb v = asVector64 $ BS.toByteString $ DVS.generate (DVS.length v) go+ where go :: Int -> Word16+ go uj = let ui = fromIntegral uj in fromIntegral (pext (DVS.unsafeIndex v ui) 0x4444444444444444) makeBpOp :: DVS.Vector Word64 -> DVS.Vector Word64- makeBpOp v = asVector64 $ BS.toByteString $ DVS.constructN (DVS.length v) go- where go :: DVS.Vector Word16 -> Word16- go u = let ui = DVS.length u in fromIntegral (pext (DVS.unsafeIndex v ui) 0x2222222222222222)- makeBpCl v = asVector64 $ BS.toByteString $ DVS.constructN (DVS.length v) go- where go :: DVS.Vector Word16 -> Word16- go u = let ui = DVS.length u in fromIntegral (pext (DVS.unsafeIndex v ui) 0x1111111111111111)+ makeBpOp v = asVector64 $ BS.toByteString $ DVS.generate (DVS.length v) go+ where go :: Int -> Word16+ go uj = let ui = fromIntegral uj in fromIntegral (pext (DVS.unsafeIndex v ui) 0x2222222222222222)+ makeBpCl v = asVector64 $ BS.toByteString $ DVS.generate (DVS.length v) go+ where go :: Int -> Word16+ go uj = let ui = fromIntegral uj in fromIntegral (pext (DVS.unsafeIndex v ui) 0x1111111111111111) toIbBpBuilders :: [PreSiChunk (DVS.Vector Word64)] -> [SiChunk (DVS.Vector Word64)] toIbBpBuilders = go 0 0