hw-prim 0.6.2.38 → 0.6.2.39
raw patch · 4 files changed
+167/−147 lines, 4 filesdep ~hedgehogPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
Dependency ranges changed: hedgehog
API changes (from Hackage documentation)
+ HaskellWorks.Data.ByteString: padded :: Int -> ByteString -> ByteString
Files
- hw-prim.cabal +129/−135
- src/HaskellWorks/Data/ByteString.hs +5/−0
- src/HaskellWorks/Data/Vector/Storable.hs +11/−10
- test/HaskellWorks/Data/Vector/StorableSpec.hs +22/−2
hw-prim.cabal view
@@ -1,31 +1,30 @@ cabal-version: 2.2 -name: hw-prim-version: 0.6.2.38-synopsis: Primitive functions and data types-description: Primitive functions and data types.-category: Data-stability: Experimental-homepage: http://github.com/haskell-works/hw-prim#readme-bug-reports: https://github.com/haskell-works/hw-prim/issues-author: John Ky-maintainer: newhoggy@gmail.com-copyright: 2016-2019 John Ky-license: BSD-3-Clause-license-file: LICENSE-tested-with: GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2-build-type: Simple-extra-source-files:- README.md+name: hw-prim+version: 0.6.2.39+synopsis: Primitive functions and data types+description: Primitive functions and data types.+category: Data+stability: Experimental+homepage: http://github.com/haskell-works/hw-prim#readme+bug-reports: https://github.com/haskell-works/hw-prim/issues+author: John Ky+maintainer: newhoggy@gmail.com+copyright: 2016-2019 John Ky+license: BSD-3-Clause+license-file: LICENSE+tested-with: GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2+build-type: Simple+extra-source-files: README.md source-repository head- type: git- location: https://github.com/haskell-works/hw-prim+ type: git+ location: https://github.com/haskell-works/hw-prim flag bounds-checking-enabled- description: Enable bmi2 instruction set- manual: False- default: False+ description: Enable bmi2 instruction set+ manual: False+ default: False common base { build-depends: base >= 4 && < 5 } @@ -36,7 +35,7 @@ common directory { build-depends: directory >= 1.2 && < 1.4 } common exceptions { build-depends: exceptions >= 0.8 && < 0.11 } common ghc-prim { build-depends: ghc-prim >= 0.5 && < 0.6 }-common hedgehog { build-depends: hedgehog >= 0.5 && < 1.1 }+common hedgehog { build-depends: hedgehog >= 1.0 && < 1.1 } common hspec { build-depends: hspec >= 2.4 && < 2.8 } common hw-hspec-hedgehog { build-depends: hw-hspec-hedgehog >= 0.1 && < 0.2 } common mmap { build-depends: mmap >= 0.5 && < 0.6 }@@ -46,122 +45,117 @@ common unliftio-core { build-depends: unliftio-core >= 0.1.2.0 && < 0.2 } common common- default-language: Haskell2010- ghc-options: -Wall -O2 -msse4.2+ default-language: Haskell2010+ ghc-options: -Wall -O2 -msse4.2 if flag(bounds-checking-enabled)- cpp-options: -DBOUNDS_CHECKING_ENABLED+ cpp-options: -DBOUNDS_CHECKING_ENABLED library- import: base- , common- , bytestring- , deepseq- , ghc-prim- , mmap- , semigroups- , transformers- , unliftio-core- , vector- exposed-modules:- HaskellWorks.Control.Monad.Lazy- HaskellWorks.Data.AtIndex- HaskellWorks.Data.Branchless- HaskellWorks.Data.ByteString- HaskellWorks.Data.ByteString.Builder- HaskellWorks.Data.ByteString.Lazy- HaskellWorks.Data.Char- HaskellWorks.Data.Char.IsChar- HaskellWorks.Data.Concat- HaskellWorks.Data.Cons- HaskellWorks.Data.Container- HaskellWorks.Data.Decode- HaskellWorks.Data.Drop- HaskellWorks.Data.Empty- HaskellWorks.Data.Filter- HaskellWorks.Data.Foldable- HaskellWorks.Data.FromByteString- HaskellWorks.Data.FromForeignRegion- HaskellWorks.Data.FromString- HaskellWorks.Data.Generate- HaskellWorks.Data.Head- HaskellWorks.Data.Length- HaskellWorks.Data.Naive- HaskellWorks.Data.Null- HaskellWorks.Data.Ops- HaskellWorks.Data.Positioning- HaskellWorks.Data.Product- HaskellWorks.Data.Search- HaskellWorks.Data.Sign- HaskellWorks.Data.Snoc- HaskellWorks.Data.Take- HaskellWorks.Data.TreeCursor- HaskellWorks.Data.Uncons- HaskellWorks.Data.Unsign- HaskellWorks.Data.Unsnoc- HaskellWorks.Data.Vector.AsVector64- HaskellWorks.Data.Vector.AsVector64ns- HaskellWorks.Data.Vector.AsVector64s- HaskellWorks.Data.Vector.AsVector8- HaskellWorks.Data.Vector.AsVector8ns- HaskellWorks.Data.Vector.AsVector8s- HaskellWorks.Data.Vector.BoxedVectorLike- HaskellWorks.Data.Vector.Storable- HaskellWorks.Data.Vector.StorableVectorLike- HaskellWorks.Data.Word- HaskellWorks.Foreign- other-modules: Paths_hw_prim- autogen-modules: Paths_hw_prim- hs-source-dirs: src- other-extensions: AllowAmbiguousTypes+ import: base+ , common+ , bytestring+ , deepseq+ , ghc-prim+ , mmap+ , semigroups+ , transformers+ , unliftio-core+ , vector+ exposed-modules: HaskellWorks.Control.Monad.Lazy+ HaskellWorks.Data.AtIndex+ HaskellWorks.Data.Branchless+ HaskellWorks.Data.ByteString+ HaskellWorks.Data.ByteString.Builder+ HaskellWorks.Data.ByteString.Lazy+ HaskellWorks.Data.Char+ HaskellWorks.Data.Char.IsChar+ HaskellWorks.Data.Concat+ HaskellWorks.Data.Cons+ HaskellWorks.Data.Container+ HaskellWorks.Data.Decode+ HaskellWorks.Data.Drop+ HaskellWorks.Data.Empty+ HaskellWorks.Data.Filter+ HaskellWorks.Data.Foldable+ HaskellWorks.Data.FromByteString+ HaskellWorks.Data.FromForeignRegion+ HaskellWorks.Data.FromString+ HaskellWorks.Data.Generate+ HaskellWorks.Data.Head+ HaskellWorks.Data.Length+ HaskellWorks.Data.Naive+ HaskellWorks.Data.Null+ HaskellWorks.Data.Ops+ HaskellWorks.Data.Positioning+ HaskellWorks.Data.Product+ HaskellWorks.Data.Search+ HaskellWorks.Data.Sign+ HaskellWorks.Data.Snoc+ HaskellWorks.Data.Take+ HaskellWorks.Data.TreeCursor+ HaskellWorks.Data.Uncons+ HaskellWorks.Data.Unsign+ HaskellWorks.Data.Unsnoc+ HaskellWorks.Data.Vector.AsVector64+ HaskellWorks.Data.Vector.AsVector64ns+ HaskellWorks.Data.Vector.AsVector64s+ HaskellWorks.Data.Vector.AsVector8+ HaskellWorks.Data.Vector.AsVector8ns+ HaskellWorks.Data.Vector.AsVector8s+ HaskellWorks.Data.Vector.BoxedVectorLike+ HaskellWorks.Data.Vector.Storable+ HaskellWorks.Data.Vector.StorableVectorLike+ HaskellWorks.Data.Word+ HaskellWorks.Foreign+ other-modules: Paths_hw_prim+ autogen-modules: Paths_hw_prim+ hs-source-dirs: src test-suite hw-prim-test- import: base- , common- , QuickCheck- , bytestring- , directory- , exceptions- , hedgehog- , hspec- , hw-hspec-hedgehog- , mmap- , semigroups- , transformers- , vector- type: exitcode-stdio-1.0- main-is: Spec.hs- other-modules:- HaskellWorks.Data.ByteStringSpec- HaskellWorks.Data.FoldableSpec- HaskellWorks.Data.FromByteStringSpec- HaskellWorks.Data.FromForeignRegionSpec- HaskellWorks.Data.SearchSpec- HaskellWorks.Data.Vector.AsVector64nsSpec- HaskellWorks.Data.Vector.AsVector64sSpec- HaskellWorks.Data.Vector.AsVector8nsSpec- HaskellWorks.Data.Vector.AsVector8sSpec- HaskellWorks.Data.Vector.StorableSpec- Paths_hw_prim- autogen-modules: Paths_hw_prim- build-depends: hw-prim- hs-source-dirs: test- other-extensions: AllowAmbiguousTypes- ghc-options: -threaded -rtsopts -with-rtsopts=-N- build-tool-depends: hspec-discover:hspec-discover+ import: base+ , common+ , QuickCheck+ , bytestring+ , directory+ , exceptions+ , hedgehog+ , hspec+ , hw-hspec-hedgehog+ , mmap+ , semigroups+ , transformers+ , vector+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ other-modules: HaskellWorks.Data.ByteStringSpec+ HaskellWorks.Data.FoldableSpec+ HaskellWorks.Data.FromByteStringSpec+ HaskellWorks.Data.FromForeignRegionSpec+ HaskellWorks.Data.SearchSpec+ HaskellWorks.Data.Vector.AsVector64nsSpec+ HaskellWorks.Data.Vector.AsVector64sSpec+ HaskellWorks.Data.Vector.AsVector8nsSpec+ HaskellWorks.Data.Vector.AsVector8sSpec+ HaskellWorks.Data.Vector.StorableSpec+ Paths_hw_prim+ autogen-modules: Paths_hw_prim+ build-depends: hw-prim+ hs-source-dirs: test+ ghc-options: -threaded -rtsopts -with-rtsopts=-N+ build-tool-depends: hspec-discover:hspec-discover benchmark bench- import: base- , common- , bytestring- , criterion- , mmap- , semigroups- , transformers- , vector- type: exitcode-stdio-1.0- main-is: Main.hs- other-modules: Paths_hw_prim- hs-source-dirs: bench- build-depends: hw-prim- other-extensions: AllowAmbiguousTypes- autogen-modules: Paths_hw_prim+ import: base+ , common+ , bytestring+ , criterion+ , mmap+ , semigroups+ , transformers+ , vector+ type: exitcode-stdio-1.0+ main-is: Main.hs+ other-modules: Paths_hw_prim+ hs-source-dirs: bench+ build-depends: hw-prim+ autogen-modules: Paths_hw_prim
src/HaskellWorks/Data/ByteString.hs view
@@ -8,6 +8,7 @@ , ToByteString(..) , ToByteStrings(..) , mmap+ , padded , rechunk , rechunkPadded , resegment@@ -219,3 +220,7 @@ (fptr :: ForeignPtr Word8, offset, size) <- IO.mmapFileForeignPtr filepath IO.ReadOnly Nothing let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size return bs++padded :: Int -> BS.ByteString -> BS.ByteString+padded n v = v <> BS.replicate ((n - BS.length v) `max` 0) 0+{-# INLINE padded #-}
src/HaskellWorks/Data/Vector/Storable.hs view
@@ -108,20 +108,21 @@ construct64UnzipN :: Int -> [(BS.ByteString, BS.ByteString)] -> (DVS.Vector Word64, DVS.Vector Word64) construct64UnzipN nBytes xs = (DVS.unsafeCast ibv, DVS.unsafeCast bpv) where [ibv, bpv] = DVS.createT $ do- let nW64s = (nBytes + 7) `div` 8- ibmv <- DVSM.new nW64s- bpmv <- DVSM.new nW64s+ let nW8s = (nBytes + 7) `div` 8 * 8+ ibmv <- DVSM.new nW8s+ bpmv <- DVSM.new nW8s (ibmvRemaining, bpmvRemaining) <- go ibmv bpmv xs- return- [ DVSM.take (((DVSM.length ibmv - ibmvRemaining) `div` 8) * 8) ibmv- , DVSM.take (((DVSM.length bpmv - bpmvRemaining) `div` 8) * 8) bpmv- ]+ let ibl = ((DVSM.length ibmv - ibmvRemaining + 7) `div` 8) * 8+ let bpl = ((DVSM.length bpmv - bpmvRemaining + 7) `div` 8) * 8+ return [ DVSM.take ibl ibmv, DVSM.take bpl bpmv] go :: DVSM.MVector s Word8 -> DVSM.MVector s Word8 -> [(BS.ByteString, BS.ByteString)] -> ST s (Int, Int) go ibmv bpmv ((ib, bp):ys) = do DVS.copy (DVSM.take (BS.length ib) ibmv) (asVector8 ib) DVS.copy (DVSM.take (BS.length bp) bpmv) (asVector8 bp) go (DVSM.drop (BS.length ib) ibmv) (DVSM.drop (BS.length bp) bpmv) ys go ibmv bpmv [] = do- DVSM.set (DVSM.take 8 ibmv) 0- DVSM.set (DVSM.take 8 bpmv) 0- return (DVSM.length (DVSM.drop 8 ibmv), DVSM.length (DVSM.drop 8 bpmv))+ let ibl = DVSM.length ibmv `mod` 8+ let bpl = DVSM.length bpmv `mod` 8+ DVSM.set (DVSM.take ibl ibmv) 0+ DVSM.set (DVSM.take bpl bpmv) 0+ return (DVSM.length (DVSM.drop ibl ibmv), DVSM.length (DVSM.drop bpl bpmv))
test/HaskellWorks/Data/Vector/StorableSpec.hs view
@@ -6,15 +6,18 @@ ( spec ) where -import Control.Monad.ST (ST)-import Data.Vector.Storable (Storable)+import Control.Monad.ST (ST)+import Data.Vector.Storable (Storable)+import HaskellWorks.Data.Vector.Storable (construct64UnzipN) import HaskellWorks.Hspec.Hedgehog import Hedgehog import Test.Hspec +import qualified Data.ByteString as BS import qualified Data.List as L import qualified Data.Vector.Storable as DVS import qualified Data.Vector.Storable.Mutable as DVSM+import qualified HaskellWorks.Data.ByteString as BS import qualified HaskellWorks.Data.Vector.Storable as DVS import qualified Hedgehog.Gen as G import qualified Hedgehog.Range as R@@ -36,6 +39,23 @@ let (bs, cs) = DVS.construct2N (length as) stepb (length as * 2) stepc as DVS.fromList as === bs DVS.fromList (dupList as) === cs+ describe "construct64UnzipN" $ do+ it "property" $ requireProperty $ do+ abss <- forAll $ G.list (R.linear 1 8) $ (,)+ <$> (fmap BS.pack (G.list (R.linear 1 8) (G.word8 R.constantBounded)))+ <*> (fmap BS.pack (G.list (R.linear 1 8) (G.word8 R.constantBounded)))+ ass <- forAll $ pure $ fmap fst abss+ bss <- forAll $ pure $ fmap snd abss+ as <- forAll $ pure $ mconcat ass+ bs <- forAll $ pure $ mconcat bss+ al <- forAll $ pure $ BS.length (mconcat ass)+ bl <- forAll $ pure $ BS.length (mconcat bss)+ len <- forAll $ pure $ al + bl+ let res = construct64UnzipN len (zip ass bss)+ let ra = BS.toByteString (fst res)+ let rb = BS.toByteString (snd res)+ ra === BS.padded ((BS.length as + 7) `div` 8 * 8) as+ rb === BS.padded ((BS.length bs + 7) `div` 8 * 8) bs dupList :: [a] -> [a] dupList (a:as) = (a:a:dupList as)