From a15b880c829d2ae680345609f8fd8e24374e5672 Mon Sep 17 00:00:00 2001 From: Ben Blaxill Date: Thu, 23 Feb 2023 12:19:15 +0000 Subject: [PATCH 1/3] Fix BitSeq Snoc instance --- src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs b/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs index 3a6d622..1932d80 100644 --- a/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs +++ b/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs @@ -85,8 +85,8 @@ instance HW.Cons BitSeq where instance HW.Snoc BitSeq where snoc (BitSeq ft) b = BitSeq $ case FT.viewr ft of lt :> Elem w nw -> if nw >= 0 && nw < 64 - then Elem (w .|. (bw .<. nw)) (nw + 1) <| lt - else Elem bw 1 <| lt + then lt |> Elem (w .|. (bw .<. nw)) (nw + 1) + else ft |> Elem bw 1 FT.EmptyR -> FT.singleton (Elem bw 1) where bw = if b then 1 else 0 From d67b8aedf337edfbf9c8e251d4285a0e917c1bb4 Mon Sep 17 00:00:00 2001 From: Ben Blaxill Date: Thu, 23 Feb 2023 12:19:48 +0000 Subject: [PATCH 2/3] Add Monoid instance for BitSeq --- src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs b/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs index 1932d80..ebe2d78 100644 --- a/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs +++ b/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs @@ -99,6 +99,9 @@ instance Semigroup BitSeq where FT.EmptyL -> tr FT.EmptyR -> FT.empty +instance Monoid BitSeq where + mempty = BitSeq mempty + instance Select1 BitSeq where select1 (BitSeq ft) n = case FT.split (atPopCountBelow n) ft of (lt, _) -> case FT.viewr lt of From 05961167f30cc9a0d44e33b74f1006c3aa5f8ddc Mon Sep 17 00:00:00 2001 From: Ben Blaxill Date: Fri, 24 Feb 2023 12:35:44 +0000 Subject: [PATCH 3/3] Fix BitSeq PopCount1 instance --- src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs b/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs index ebe2d78..628027e 100644 --- a/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs +++ b/src/HaskellWorks/Data/RankSelect/Internal/BitSeq.hs @@ -115,7 +115,7 @@ instance Rank1 BitSeq where rank1 bs n = let (lt, _) = splitAt n bs in popCount1 lt instance PopCount1 BitSeq where - popCount1 (BitSeq ft) = measureBitCount (FT.measure ft :: Measure) + popCount1 (BitSeq ft) = measurePopCount (FT.measure ft :: Measure) (|>#) :: BitSeqFt -> Elem -> BitSeqFt (|>#) ft e@(Elem _ wn) = if wn > 0 then ft |> e else ft