hw-rankselect-base 0.3.2.2 → 0.3.2.3
raw patch · 3 files changed
+23/−1 lines, 3 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ HaskellWorks.Data.RankSelect.Base.Rank1: instance (HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 w, HaskellWorks.Data.RankSelect.Base.Rank1.Rank1 w, Data.Bits.BitSize.BitSize w) => HaskellWorks.Data.RankSelect.Base.Rank1.Rank1 [w]
+ HaskellWorks.Data.RankSelect.Base.Select1: instance (HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 w, HaskellWorks.Data.RankSelect.Base.Select1.Select1 w, Data.Bits.BitSize.BitSize w) => HaskellWorks.Data.RankSelect.Base.Select1.Select1 [w]
Files
- hw-rankselect-base.cabal +1/−1
- src/HaskellWorks/Data/RankSelect/Base/Rank1.hs +10/−0
- src/HaskellWorks/Data/RankSelect/Base/Select1.hs +12/−0
hw-rankselect-base.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: hw-rankselect-base-version: 0.3.2.2+version: 0.3.2.3 synopsis: Rank-select base description: Please see README.md category: Data, Bit, Succinct Data Structures, Data Structures
src/HaskellWorks/Data/RankSelect/Base/Rank1.hs view
@@ -6,6 +6,7 @@ ( Rank1(..) ) where +import Data.Bits.BitSize import Data.Word import HaskellWorks.Data.AtIndex import HaskellWorks.Data.Bits.BitShown@@ -50,6 +51,15 @@ rank1 False 0 = 0 rank1 False 1 = 0 rank1 _ _ = error "Invalid position for rank1"++instance (PopCount1 w, Rank1 w, BitSize w) => Rank1 [w] where+ rank1 = go 0+ where go c (w:ws) p = if p <= bitCount w+ then c + rank1 w p+ else go (c + popCount1 w) ws (p - bitCount w)+ go c [] _ = c++ {-# INLINABLE rank1 #-} instance Rank1 (DV.Vector Word8) where rank1 v p = popCount1 prefix + if r == 0 then 0 else (`rank1` r) maybeElem
src/HaskellWorks/Data/RankSelect/Base/Select1.hs view
@@ -7,6 +7,7 @@ ( Select1(..) ) where +import Data.Bits.BitSize import Data.Word import HaskellWorks.Data.AtIndex import HaskellWorks.Data.Bits.BitShown@@ -146,4 +147,15 @@ case popCount1 w of pc | d <= pc -> select1 w d + acc pc -> go (n + 1) (d - pc) (acc + elemFixedBitSize v)+ {-# INLINE select1 #-}++instance (PopCount1 w, Select1 w, BitSize w) => Select1 [w] where+ select1 v c = go v c 0+ where go _ 0 acc = acc+ go u d acc = case u of+ w:ws -> let pc = popCount1 w in+ if d <= pc+ then select1 w d + acc+ else go ws (d - pc) (acc + bitCount w)+ [] -> acc {-# INLINE select1 #-}