packages feed

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 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 #-}