{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}

module HaskellWorks.Data.Bits.PopCount.PopCount0
    ( PopCount0(..)
    ) where

import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Bits.PopCount.PopCount1
import HaskellWorks.Data.Bits.Types.Broadword
import HaskellWorks.Data.Bits.Types.Builtin
import HaskellWorks.Data.Positioning
import Prelude                                   as P

import qualified Data.Bit             as Bit
import qualified Data.Bit.ThreadSafe  as BitTS
import qualified Data.Vector          as DV
import qualified Data.Vector.Storable as DVS
import qualified Data.Vector.Unboxed  as DVU

class PopCount0 v where
  -- | The number of 0-bits in the value.
  popCount0 :: v -> Count

instance PopCount0 Bool where
  popCount0 :: Bool -> Count
popCount0 Bool
True  = Count
0
  popCount0 Bool
False = Count
1
  {-# INLINE popCount0 #-}

instance PopCount0 Word8 where
  popCount0 :: Word8 -> Count
popCount0 = Word8 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Word8 -> Count) -> (Word8 -> Word8) -> Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Word8
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 Word16 where
  popCount0 :: Word16 -> Count
popCount0 = Word16 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Word16 -> Count) -> (Word16 -> Word16) -> Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Word16
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 Word32 where
  popCount0 :: Word32 -> Count
popCount0 = Word32 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Word32 -> Count) -> (Word32 -> Word32) -> Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Word32
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 Word64 where
  popCount0 :: Count -> Count
popCount0 = Count -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Count -> Count) -> (Count -> Count) -> Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Count -> Count
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Broadword Word8) where
  popCount0 :: Broadword Word8 -> Count
popCount0 = Broadword Word8 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Broadword Word8 -> Count)
-> (Broadword Word8 -> Broadword Word8) -> Broadword Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word8 -> Broadword Word8
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Broadword Word16) where
  popCount0 :: Broadword Word16 -> Count
popCount0 = Broadword Word16 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Broadword Word16 -> Count)
-> (Broadword Word16 -> Broadword Word16)
-> Broadword Word16
-> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word16 -> Broadword Word16
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Broadword Word32) where
  popCount0 :: Broadword Word32 -> Count
popCount0 = Broadword Word32 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Broadword Word32 -> Count)
-> (Broadword Word32 -> Broadword Word32)
-> Broadword Word32
-> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word32 -> Broadword Word32
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Broadword Word64) where
  popCount0 :: Broadword Count -> Count
popCount0 = Broadword Count -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Broadword Count -> Count)
-> (Broadword Count -> Broadword Count) -> Broadword Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Count -> Broadword Count
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Builtin Word8) where
  popCount0 :: Builtin Word8 -> Count
popCount0 = Builtin Word8 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Word8 -> Count)
-> (Builtin Word8 -> Builtin Word8) -> Builtin Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word8 -> Builtin Word8
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Builtin Word16) where
  popCount0 :: Builtin Word16 -> Count
popCount0 = Builtin Word16 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Word16 -> Count)
-> (Builtin Word16 -> Builtin Word16) -> Builtin Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word16 -> Builtin Word16
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Builtin Word32) where
  popCount0 :: Builtin Word32 -> Count
popCount0 = Builtin Word32 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Word32 -> Count)
-> (Builtin Word32 -> Builtin Word32) -> Builtin Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word32 -> Builtin Word32
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 (Builtin Word64) where
  popCount0 :: Builtin Count -> Count
popCount0 = Builtin Count -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Count -> Count)
-> (Builtin Count -> Builtin Count) -> Builtin Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Count -> Builtin Count
forall a. BitWise a => a -> a
comp
  {-# INLINE popCount0 #-}

instance PopCount0 a => PopCount0 [a] where
  popCount0 :: [a] -> Count
popCount0 = [Count] -> Count
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
P.sum ([Count] -> Count) -> ([a] -> [Count]) -> [a] -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Count) -> [a] -> [Count]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Count
forall v. PopCount0 v => v -> Count
popCount0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector Word8) where
  popCount0 :: Vector Word8 -> Count
popCount0 = (Count -> Word8 -> Count) -> Count -> Vector Word8 -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Word8 -> Count) -> Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector Word16) where
  popCount0 :: Vector Word16 -> Count
popCount0 = (Count -> Word16 -> Count) -> Count -> Vector Word16 -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Word16 -> Count) -> Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector Word32) where
  popCount0 :: Vector Word32 -> Count
popCount0 = (Count -> Word32 -> Count) -> Count -> Vector Word32 -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Word32 -> Count) -> Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector Word64) where
  popCount0 :: Vector Count -> Count
popCount0 = (Count -> Count -> Count) -> Count -> Vector Count -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Count -> Count) -> Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Count -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector Word8) where
  popCount0 :: Vector Word8 -> Count
popCount0 = (Count -> Word8 -> Count) -> Count -> Vector Word8 -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Word8 -> Count) -> Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector Word16) where
  popCount0 :: Vector Word16 -> Count
popCount0 = (Count -> Word16 -> Count) -> Count -> Vector Word16 -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Word16 -> Count) -> Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector Word32) where
  popCount0 :: Vector Word32 -> Count
popCount0 = (Count -> Word32 -> Count) -> Count -> Vector Word32 -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Word32 -> Count) -> Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector Word64) where
  popCount0 :: Vector Count -> Count
popCount0 = (Count -> Count -> Count) -> Count -> Vector Count -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count) -> (Count -> Count) -> Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Count -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

-- Vector of Builtin instances

instance PopCount0 (DV.Vector (Builtin Word8)) where
  popCount0 :: Vector (Builtin Word8) -> Count
popCount0 = (Count -> Builtin Word8 -> Count)
-> Count -> Vector (Builtin Word8) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Word8 -> Count) -> Builtin Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word8 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector (Builtin Word16)) where
  popCount0 :: Vector (Builtin Word16) -> Count
popCount0 = (Count -> Builtin Word16 -> Count)
-> Count -> Vector (Builtin Word16) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Word16 -> Count) -> Builtin Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word16 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector (Builtin Word32)) where
  popCount0 :: Vector (Builtin Word32) -> Count
popCount0 = (Count -> Builtin Word32 -> Count)
-> Count -> Vector (Builtin Word32) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Word32 -> Count) -> Builtin Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word32 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector (Builtin Word64)) where
  popCount0 :: Vector (Builtin Count) -> Count
popCount0 = (Count -> Builtin Count -> Count)
-> Count -> Vector (Builtin Count) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Count -> Count) -> Builtin Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Count -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Builtin Word8)) where
  popCount0 :: Vector (Builtin Word8) -> Count
popCount0 = (Count -> Builtin Word8 -> Count)
-> Count -> Vector (Builtin Word8) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Word8 -> Count) -> Builtin Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word8 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Builtin Word16)) where
  popCount0 :: Vector (Builtin Word16) -> Count
popCount0 = (Count -> Builtin Word16 -> Count)
-> Count -> Vector (Builtin Word16) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Word16 -> Count) -> Builtin Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word16 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Builtin Word32)) where
  popCount0 :: Vector (Builtin Word32) -> Count
popCount0 = (Count -> Builtin Word32 -> Count)
-> Count -> Vector (Builtin Word32) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Word32 -> Count) -> Builtin Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word32 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Builtin Word64)) where
  popCount0 :: Vector (Builtin Count) -> Count
popCount0 = (Count -> Builtin Count -> Count)
-> Count -> Vector (Builtin Count) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Builtin Count -> Count) -> Builtin Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Count -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

-- Vector of Broadword instances

instance PopCount0 (DV.Vector (Broadword Word8)) where
  popCount0 :: Vector (Broadword Word8) -> Count
popCount0 = (Count -> Broadword Word8 -> Count)
-> Count -> Vector (Broadword Word8) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Word8 -> Count) -> Broadword Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word8 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector (Broadword Word16)) where
  popCount0 :: Vector (Broadword Word16) -> Count
popCount0 = (Count -> Broadword Word16 -> Count)
-> Count -> Vector (Broadword Word16) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Word16 -> Count) -> Broadword Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word16 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector (Broadword Word32)) where
  popCount0 :: Vector (Broadword Word32) -> Count
popCount0 = (Count -> Broadword Word32 -> Count)
-> Count -> Vector (Broadword Word32) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Word32 -> Count) -> Broadword Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word32 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DV.Vector (Broadword Word64)) where
  popCount0 :: Vector (Broadword Count) -> Count
popCount0 = (Count -> Broadword Count -> Count)
-> Count -> Vector (Broadword Count) -> Count
forall a b. (a -> b -> a) -> a -> Vector b -> a
DV.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Count -> Count) -> Broadword Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Count -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Broadword Word8)) where
  popCount0 :: Vector (Broadword Word8) -> Count
popCount0 = (Count -> Broadword Word8 -> Count)
-> Count -> Vector (Broadword Word8) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Word8 -> Count) -> Broadword Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word8 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Broadword Word16)) where
  popCount0 :: Vector (Broadword Word16) -> Count
popCount0 = (Count -> Broadword Word16 -> Count)
-> Count -> Vector (Broadword Word16) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Word16 -> Count) -> Broadword Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word16 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Broadword Word32)) where
  popCount0 :: Vector (Broadword Word32) -> Count
popCount0 = (Count -> Broadword Word32 -> Count)
-> Count -> Vector (Broadword Word32) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Word32 -> Count) -> Broadword Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Word32 -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVS.Vector (Broadword Word64)) where
  popCount0 :: Vector (Broadword Count) -> Count
popCount0 = (Count -> Broadword Count -> Count)
-> Count -> Vector (Broadword Count) -> Count
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
DVS.foldl' (\Count
c -> (Count
c Count -> Count -> Count
forall a. Num a => a -> a -> a
+) (Count -> Count)
-> (Broadword Count -> Count) -> Broadword Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Broadword Count -> Count
forall v. PopCount0 v => v -> Count
popCount0) Count
0
  {-# INLINE popCount0 #-}

instance PopCount0 (DVU.Vector Bit.Bit) where
  popCount0 :: Vector Bit -> Count
popCount0 Vector Bit
v = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Count) -> Int -> Count
forall a b. (a -> b) -> a -> b
$ Vector Bit -> Int
forall a. Unbox a => Vector a -> Int
DVU.length Vector Bit
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Vector Bit -> Int
Bit.countBits Vector Bit
v
  {-# INLINE popCount0 #-}

instance PopCount0 (DVU.Vector BitTS.Bit) where
  popCount0 :: Vector Bit -> Count
popCount0 Vector Bit
v = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Count) -> Int -> Count
forall a b. (a -> b) -> a -> b
$ Vector Bit -> Int
forall a. Unbox a => Vector a -> Int
DVU.length Vector Bit
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Vector Bit -> Int
BitTS.countBits Vector Bit
v
  {-# INLINE popCount0 #-}