hw-rankselect 0.8.0.0 → 0.8.0.1
raw patch · 3 files changed
+22/−18 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- HaskellWorks.Data.RankSelect.Poppy512S: Poppy512S :: Vector Word64 -> Vector Word64 -> Vector Word64 -> Poppy512S
+ HaskellWorks.Data.RankSelect.Poppy512S: Poppy512S :: !(Vector Word64) -> !(Vector Word64) -> !(Vector Word64) -> Poppy512S
- HaskellWorks.Data.RankSelect.Poppy512S: [poppy512Index] :: Poppy512S -> Vector Word64
+ HaskellWorks.Data.RankSelect.Poppy512S: [poppy512Index] :: Poppy512S -> !(Vector Word64)
- HaskellWorks.Data.RankSelect.Poppy512S: [poppy512SBits] :: Poppy512S -> Vector Word64
+ HaskellWorks.Data.RankSelect.Poppy512S: [poppy512SBits] :: Poppy512S -> !(Vector Word64)
- HaskellWorks.Data.RankSelect.Poppy512S: [poppy512Samples] :: Poppy512S -> Vector Word64
+ HaskellWorks.Data.RankSelect.Poppy512S: [poppy512Samples] :: Poppy512S -> !(Vector Word64)
Files
- README.md +0/−5
- hw-rankselect.cabal +1/−1
- src/HaskellWorks/Data/RankSelect/Poppy512S.hs +21/−12
README.md view
@@ -2,8 +2,3 @@ [](https://circleci.com/gh/haskell-works/hw-rankselect/tree/0.0-branch) Rank and select operations.--```-cabal repl hw-rankselect-test-λ> :trace main-```
hw-rankselect.cabal view
@@ -1,5 +1,5 @@ name: hw-rankselect-version: 0.8.0.0+version: 0.8.0.1 synopsis: Rank-select description: Please see README.md homepage: http://github.com/haskell-works/hw-rankselect#readme
src/HaskellWorks/Data/RankSelect/Poppy512S.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE BangPatterns #-}+ module HaskellWorks.Data.RankSelect.Poppy512S ( Poppy512S(..) , Rank1(..)@@ -30,9 +32,9 @@ import Prelude hiding (length) data Poppy512S = Poppy512S- { poppy512SBits :: DVS.Vector Word64- , poppy512Index :: DVS.Vector Word64- , poppy512Samples :: DVS.Vector Word64 -- Sampling position of each 8192 1-bit+ { poppy512SBits :: !(DVS.Vector Word64)+ , poppy512Index :: !(DVS.Vector Word64)+ , poppy512Samples :: !(DVS.Vector Word64) -- Sampling position of each 8192 1-bit } deriving (Eq, Show) instance AsVector64 Poppy512S where@@ -45,20 +47,27 @@ makePoppy512S :: DVS.Vector Word64 -> Poppy512S makePoppy512S v = Poppy512S { poppy512SBits = v- , poppy512Index = DVS.constructN (((DVS.length v + 8 - 1) `div` 8) + 1) gen512Index- , poppy512Samples = DVS.unfoldrN (fromIntegral (popCount1 v `div` 8192) + 1) genS (0, 0)+ , poppy512Index = DVS.constructN (((DVS.length v + 8 - 1) `div` 8) + 1) gen512Index+ , poppy512Samples = DVS.unfoldrN (fromIntegral (popCount1 v `div` 8192) + 1) genS (0, 0) }- where gen512Index u = let indexN = DVS.length u - 1 in+ where gen512Index !u = let !indexN = DVS.length u - 1 in if indexN == -1 then 0- else popCount1Range (indexN * 8) 8 v + DVS.last u+ else let !result = popCount1Range (indexN * 8) 8 v + DVS.last u in result genS :: (Count, Position) -> Maybe (Word64, (Count, Position))- genS (pca, n) = if n < end v- then let w = v !!! n in- let pcz = pca + popCount1 w in+ genS (!pca, !n) = if n < end v+ then let !w = v !!! n in+ let !pcz = pca + popCount1 w in if (8192 - 1 + pca) `div` 8192 /= (8192 - 1 + pcz) `div` 8192- then Just (fromIntegral n * 64 + fromIntegral (select1 w (fromIntegral (8192 - (pca `mod` 8192)))), (pcz, n + 1))- else genS (pcz, n + 1)+ then let !newWord = fromIntegral n * 64 + fromIntegral (select1 w (fromIntegral (8192 - (pca `mod` 8192))))+ !newCount = pcz+ !newPosition = n + 1+ !newState = (newCount, newPosition)+ !newResult = (newWord, newState) in+ Just newResult+ else let !newCount = n + 1+ !newState = (pcz, newCount) in+ genS newState else Nothing instance BitLength Poppy512S where