hw-packed-vector 0.0.0.1 → 0.0.0.2
raw patch · 7 files changed
+152/−130 lines, 7 filesdep +deepseqdep +hedgehogdep +hw-hedgehogdep −QuickCheckdep −hw-intdep −hw-string-parsedep ~bytestringdep ~hspecdep ~hw-bitsPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: deepseq, hedgehog, hw-hedgehog, hw-hspec-hedgehog
Dependencies removed: QuickCheck, hw-int, hw-string-parse, safe
Dependency ranges changed: bytestring, hspec, hw-bits, hw-prim, vector
API changes (from Hackage documentation)
+ HaskellWorks.Data.PackedVector.PackedVector64: instance Control.DeepSeq.NFData HaskellWorks.Data.PackedVector.PackedVector64.PackedVector64
+ HaskellWorks.Data.PackedVector.PackedVector64: instance GHC.Generics.Generic HaskellWorks.Data.PackedVector.PackedVector64.PackedVector64
- HaskellWorks.Data.PackedVector.PackedVector64: PackedVector64 :: !(Vector Word64) -> !Word -> !Int -> PackedVector64
+ HaskellWorks.Data.PackedVector.PackedVector64: PackedVector64 :: !Vector Word64 -> !Word -> !Int -> PackedVector64
- HaskellWorks.Data.PackedVector.PackedVector64: [swBuffer] :: PackedVector64 -> !(Vector Word64)
+ HaskellWorks.Data.PackedVector.PackedVector64: [swBuffer] :: PackedVector64 -> !Vector Word64
Files
- README.md +2/−2
- hw-packed-vector.cabal +71/−49
- src/HaskellWorks/Data/PackedVector.hs +2/−4
- src/HaskellWorks/Data/PackedVector/PackedVector64.hs +20/−14
- test/HaskellWorks/Data/PackedVector/InternalSpec.hs +18/−31
- test/HaskellWorks/Data/PackedVector/PackedVector64Spec.hs +21/−30
- test/HaskellWorks/Gen.hs +18/−0
README.md view
@@ -1,6 +1,6 @@ # hw-packed-vector-[](https://circleci.com/gh/haskell-works/hw-packed-vector/tree/0-branch) +[](https://circleci.com/gh/haskell-works/hw-packed-vector)+ A vector that stores words of equal size between 1 to 64 inclusive in memory contiguously with efficient lookup.-
hw-packed-vector.cabal view
@@ -1,53 +1,75 @@-name: hw-packed-vector-version: 0.0.0.1-synopsis: Packed Vector-description: Please see README.md-homepage: http://github.com/haskell-works/hw-packed-vector#readme-license: BSD3-license-file: LICENSE-author: John Ky-maintainer: newhoggy@gmail.com-copyright: 2016 John Ky-category: Data, Vector-stability: Experimental-build-type: Simple-extra-source-files: README.md-cabal-version: >= 1.22--library- hs-source-dirs: src- exposed-modules: HaskellWorks.Data.PackedVector- , HaskellWorks.Data.PackedVector.Internal- , HaskellWorks.Data.PackedVector.PackedVector64- build-depends: base >= 4 && < 5- , bytestring- , hw-bits >= 0.4.0.0- , hw-int >= 0.0.0.1- , hw-prim >= 0.4.0.0- , hw-string-parse >= 0.0.0.1- , safe- , vector-- default-language: Haskell2010- ghc-options: -Wall -O2 -msse4.2+cabal-version: 2.2 -test-suite hw-packed-vector-test- type: exitcode-stdio-1.0- hs-source-dirs: test- main-is: Spec.hs- other-modules: HaskellWorks.Data.PackedVector.PackedVector64Spec- , HaskellWorks.Data.PackedVector.InternalSpec- build-depends: base >= 4 && < 5- , bytestring- , hspec- , hw-bits >= 0.4.0.0- , hw-packed-vector- , hw-prim >= 0.4.0.0- , QuickCheck- , vector- ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall- default-language: Haskell2010+name: hw-packed-vector+version: 0.0.0.2+synopsis: Packed Vector+description: Packed Vector. Please see README.md+category: Data, Vector+stability: Experimental+homepage: http://github.com/haskell-works/hw-packed-vector#readme+bug-reports: https://github.com/haskell-works/hw-packed-vector/issues+author: John Ky+maintainer: newhoggy@gmail.com+copyright: 2016-2019 John Ky+license: BSD-3-Clause+license-file: LICENSE+build-type: Simple+extra-source-files:+ README.md source-repository head- type: git+ type: git location: https://github.com/haskell-works/hw-packed-vector++common base { build-depends: base >= 4 && < 5 }++common bytestring { build-depends: bytestring >= 0.10.8.2 && < 0.11 }+common deepseq { build-depends: deepseq >= 1.4 && < 1.5 }+common hedgehog { build-depends: hedgehog >= 0.6 && < 1.1 }+common hspec { build-depends: hspec >= 2.7.1 && < 3 }+common hw-bits { build-depends: hw-bits >= 0.7.0.6 && < 0.8 }+common hw-hedgehog { build-depends: hw-hedgehog >= 0.1.0.3 && < 0.2 }+common hw-hspec-hedgehog { build-depends: hw-hspec-hedgehog >= 0.1.0.7 && < 0.2 }+common hw-prim { build-depends: hw-prim >= 0.6.2.25 && < 0.7 }+common vector { build-depends: vector >= 0.12.0.3 && < 0.13 }++common config+ default-language: Haskell2010+ ghc-options: -Wall -O2 -msse4.2++library+ import: base, config+ , bytestring+ , deepseq+ , hw-bits+ , hw-prim+ , vector+ exposed-modules:+ HaskellWorks.Data.PackedVector+ HaskellWorks.Data.PackedVector.Internal+ HaskellWorks.Data.PackedVector.PackedVector64+ other-modules: Paths_hw_packed_vector+ autogen-modules: Paths_hw_packed_vector+ hs-source-dirs: src++test-suite hw-packed-vector-test+ import: base, config+ , bytestring+ , hedgehog+ , hspec+ , hw-bits+ , hw-hedgehog+ , hw-hspec-hedgehog+ , hw-prim+ , vector+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ other-modules:+ HaskellWorks.Data.PackedVector.InternalSpec+ HaskellWorks.Data.PackedVector.PackedVector64Spec+ HaskellWorks.Gen+ Paths_hw_packed_vector+ hs-source-dirs: test+ ghc-options: -threaded -rtsopts -with-rtsopts=-N+ build-depends: hw-packed-vector+ build-tools: hspec-discover
src/HaskellWorks/Data/PackedVector.hs view
@@ -1,8 +1,6 @@-{-# LANGUAGE MultiParamTypeClasses #-}- module HaskellWorks.Data.PackedVector ( module X ) where -import HaskellWorks.Data.PackedVector.Internal as X-import HaskellWorks.Data.PackedVector.PackedVector64 as X+import HaskellWorks.Data.PackedVector.Internal as X+import HaskellWorks.Data.PackedVector.PackedVector64 as X
src/HaskellWorks/Data/PackedVector/PackedVector64.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE TypeFamilies #-} module HaskellWorks.Data.PackedVector.PackedVector64 ( PackedVector64(..)@@ -7,22 +8,27 @@ , toList ) where +import Control.DeepSeq+import Data.Int+import Data.Word+import GHC.Generics+import HaskellWorks.Data.AtIndex+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Bits.LoBitsSized+import HaskellWorks.Data.PackedVector.Internal+import HaskellWorks.Data.Positioning+import HaskellWorks.Data.Unsign+import Prelude hiding (length)+ import qualified Data.Vector.Storable as DVS-import Data.Int-import Data.Word-import HaskellWorks.Data.AtIndex-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.Bits.LoBitsSized-import HaskellWorks.Data.PackedVector.Internal-import HaskellWorks.Data.Positioning-import HaskellWorks.Data.Unsign-import Prelude hiding (length) data PackedVector64 = PackedVector64- { swBuffer :: !(DVS.Vector Word64)- , swBitSize :: !Word- , swBufferLen :: !Int- } deriving (Eq, Show)+ { swBuffer :: !(DVS.Vector Word64)+ , swBitSize :: !Word+ , swBufferLen :: !Int+ } deriving (Eq, Show, Generic)++instance NFData PackedVector64 empty :: PackedVector64 empty =
test/HaskellWorks/Data/PackedVector/InternalSpec.hs view
@@ -1,38 +1,25 @@-{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}-{-# LANGUAGE ScopedTypeVariables #-}- module HaskellWorks.Data.PackedVector.InternalSpec (spec) where -import Data.Word-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.PackedVector.Internal-import HaskellWorks.Data.Positioning-import Test.Hspec-import Test.QuickCheck--{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}--subWordSize :: Count -> Gen Count-subWordSize maxWordSize = choose (1, maxWordSize)--word8OfSize :: Count -> Gen Word8-word8OfSize sz = choose (0, 1 .<. fromIntegral sz - 1)+import HaskellWorks.Data.PackedVector.Internal+import HaskellWorks.Hspec.Hedgehog+import Hedgehog+import Test.Hspec -word64OfSize :: Count -> Gen Word64-word64OfSize sz = choose (0, 1 .<. fromIntegral sz - 1)+import qualified HaskellWorks.Gen as G+import qualified Hedgehog.Gen as G+import qualified Hedgehog.Range as R -listLen :: Gen Int-listLen = choose (1, 128)+{-# ANN module ("HLint: Ignore Redundant do" :: String) #-} spec :: Spec spec = describe "HaskellWorks.Data.PackedVector.InternalSpec" $ do- it "PackedVector Word8" $- forAll (subWordSize 8) $ \wSize ->- forAll (choose (1, 3)) $ \len ->- forAll (vectorOf len (word8OfSize wSize)) $ \ws ->- unpackBits (length ws) wSize (packBits wSize ws) `shouldBe` ws- it "PackedVector Word64" $- forAll (subWordSize 64) $ \wSize ->- forAll listLen $ \len ->- forAll (vectorOf len (word64OfSize wSize)) $ \ws ->- unpackBits (length ws) wSize (packBits wSize ws) `shouldBe` ws+ it "PackedVector Word8" $ require $ property $ do+ wSize <- forAll $ G.subWordSize 8+ len <- forAll $ G.int (R.linear 1 3)+ ws <- forAll $ G.list (R.singleton len) (G.word8OfSize wSize)+ unpackBits (length ws) wSize (packBits wSize ws) === ws+ it "PackedVector Word64" $ require $ property $ do+ wSize <- forAll $ G.subWordSize 64+ len <- forAll $ G.int (R.linear 1 128)+ ws <- forAll $ G.list (R.singleton len) (G.word64OfSize wSize)+ unpackBits (length ws) wSize (packBits wSize ws) === ws
test/HaskellWorks/Data/PackedVector/PackedVector64Spec.hs view
@@ -1,37 +1,28 @@-{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}-{-# LANGUAGE ScopedTypeVariables #-}- module HaskellWorks.Data.PackedVector.PackedVector64Spec (spec) where -import Data.Word-import HaskellWorks.Data.AtIndex-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.PackedVector.PackedVector64-import HaskellWorks.Data.Positioning-import Test.Hspec-import Test.QuickCheck--{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}--subWordSize :: Count -> Gen Count-subWordSize maxWordSize = choose (1, maxWordSize)+import HaskellWorks.Data.AtIndex+import HaskellWorks.Data.PackedVector.PackedVector64+import Hedgehog+import Test.Hspec+-- import Test.QuickCheck+import HaskellWorks.Hspec.Hedgehog -word64OfSize :: Count -> Gen Word64-word64OfSize sz = choose (0, 1 .<. fromIntegral sz - 1)+import qualified HaskellWorks.Gen as G+import qualified Hedgehog.Gen as G+import qualified Hedgehog.Range as R -listLen :: Gen Int-listLen = choose (1, 128)+{-# ANN module ("HLint: Ignore Redundant do" :: String) #-} spec :: Spec spec = describe "HaskellWorks.Data.PackedVector.PackedVector64Spec" $ do- it "Round trip from list" $- forAll (subWordSize 64) $ \wSize ->- forAll listLen $ \len ->- forAll (vectorOf len (word64OfSize wSize)) $ \ws ->- toList (fromList wSize ws) `shouldBe` ws- it "Round trip from list" $- forAll (subWordSize 64) $ \wSize ->- forAll (choose (1, 32 :: Int)) $ \len ->- forAll (vectorOf len (word64OfSize wSize)) $ \ws ->- forAll (choose (0, fromIntegral len - 1 :: Position)) $ \i ->- (fromList wSize ws !!! i) `shouldBe` (ws !!! i)+ it "Round trip from list" $ require $ property $ do+ wSize <- forAll $ G.subWordSize 64+ len <- forAll $ G.int (R.linear 1 128)+ ws <- forAll $ G.list (R.singleton len) (G.word64OfSize wSize)+ toList (fromList wSize ws) === ws+ it "Round trip from list" $ require $ property $ do+ wSize <- forAll $ G.subWordSize 64+ len <- forAll $ G.int (R.linear 1 32)+ ws <- forAll $ G.list (R.singleton len) (G.word64OfSize wSize)+ i <- forAll $ G.int64 (R.linear 0 (fromIntegral len - 1))+ (fromList wSize ws !!! i) === (ws !!! i)
+ test/HaskellWorks/Gen.hs view
@@ -0,0 +1,18 @@+module HaskellWorks.Gen where++import Data.Word+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Positioning+import Hedgehog++import qualified Hedgehog.Gen as G+import qualified Hedgehog.Range as R++subWordSize :: MonadGen m => Count -> m Count+subWordSize maxWordSize = G.word64 (R.linear 1 maxWordSize)++word8OfSize :: MonadGen m => Count -> m Word8+word8OfSize sz = G.word8 (R.linear 0 (1 .<. fromIntegral sz - 1))++word64OfSize :: MonadGen m => Count -> m Word64+word64OfSize sz = G.word64 (R.linear 0 (1 .<. fromIntegral sz - 1))