{-# LANGUAGE FlexibleInstances #-}

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

import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Bits.Types.Broadword
import HaskellWorks.Data.Bits.Types.Builtin
import HaskellWorks.Data.Int.Widen.Widen64
import HaskellWorks.Data.Positioning
import Prelude                                as P

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

type FastWord a = Builtin a

fastWord :: a -> FastWord a
fastWord :: a -> FastWord a
fastWord = a -> FastWord a
forall a. a -> Builtin a
Builtin
{-# INLINE fastWord #-}

class PopCount1 v where
  -- | The number of 1-bits in the value.
  popCount1 :: v -> Count

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

instance PopCount1 (Broadword Word8) where
  popCount1 :: Broadword Word8 -> Count
popCount1 (Broadword Word8
x0) = Word8 -> Widened64 Word8
forall a. Widen64 a => a -> Widened64 a
widen64 Word8
x3
    where
      x1 :: Word8
x1 = Word8
x0 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
- ((Word8
x0 Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Word8
0xaa) Word8 -> Count -> Word8
forall a. Shift a => a -> Count -> a
.>. Count
1)
      x2 :: Word8
x2 = (Word8
x1 Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Word8
0x33) Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+ ((Word8
x1 Word8 -> Count -> Word8
forall a. Shift a => a -> Count -> a
.>. Count
2) Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Word8
0x33)
      x3 :: Word8
x3 = (Word8
x2 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+ (Word8
x2 Word8 -> Count -> Word8
forall a. Shift a => a -> Count -> a
.>. Count
4)) Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Word8
0x0f
  {-# INLINE popCount1 #-}

instance PopCount1 (Broadword Word16) where
  popCount1 :: Broadword Word16 -> Count
popCount1 (Broadword Word16
x0) = Word16 -> Widened64 Word16
forall a. Widen64 a => a -> Widened64 a
widen64 ((Word16
x3 Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
* Word16
0x0101) Word16 -> Count -> Word16
forall a. Shift a => a -> Count -> a
.>. Count
8)
    where
      x1 :: Word16
x1 = Word16
x0 Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
- ((Word16
x0 Word16 -> Word16 -> Word16
forall a. BitWise a => a -> a -> a
.&. Word16
0xaaaa) Word16 -> Count -> Word16
forall a. Shift a => a -> Count -> a
.>. Count
1)
      x2 :: Word16
x2 = (Word16
x1 Word16 -> Word16 -> Word16
forall a. BitWise a => a -> a -> a
.&. Word16
0x3333) Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
+ ((Word16
x1 Word16 -> Count -> Word16
forall a. Shift a => a -> Count -> a
.>. Count
2) Word16 -> Word16 -> Word16
forall a. BitWise a => a -> a -> a
.&. Word16
0x3333)
      x3 :: Word16
x3 = (Word16
x2 Word16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
+ (Word16
x2 Word16 -> Count -> Word16
forall a. Shift a => a -> Count -> a
.>. Count
4)) Word16 -> Word16 -> Word16
forall a. BitWise a => a -> a -> a
.&. Word16
0x0f0f
  {-# INLINE popCount1 #-}

instance PopCount1 (Broadword Word32) where
  popCount1 :: Broadword Word32 -> Count
popCount1 (Broadword Word32
x0) = Word32 -> Widened64 Word32
forall a. Widen64 a => a -> Widened64 a
widen64 ((Word32
x3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
* Word32
0x01010101) Word32 -> Count -> Word32
forall a. Shift a => a -> Count -> a
.>. Count
24)
    where
      x1 :: Word32
x1 = Word32
x0 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- ((Word32
x0 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
0xaaaaaaaa) Word32 -> Count -> Word32
forall a. Shift a => a -> Count -> a
.>. Count
1)
      x2 :: Word32
x2 = (Word32
x1 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
0x33333333) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ ((Word32
x1 Word32 -> Count -> Word32
forall a. Shift a => a -> Count -> a
.>. Count
2) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
0x33333333)
      x3 :: Word32
x3 = (Word32
x2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ (Word32
x2 Word32 -> Count -> Word32
forall a. Shift a => a -> Count -> a
.>. Count
4)) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
0x0f0f0f0f
  {-# INLINE popCount1 #-}

instance PopCount1 (Broadword Word64) where
  popCount1 :: Broadword Count -> Count
popCount1 (Broadword Count
x0) = Count -> Widened64 Count
forall a. Widen64 a => a -> Widened64 a
widen64 (Count
x3 Count -> Count -> Count
forall a. Num a => a -> a -> a
* Count
0x0101010101010101) Count -> Count -> Count
forall a. Shift a => a -> Count -> a
.>. Count
56
    where
      x1 :: Count
x1 = Count
x0 Count -> Count -> Count
forall a. Num a => a -> a -> a
- ((Count
x0 Count -> Count -> Count
forall a. BitWise a => a -> a -> a
.&. Count
0xaaaaaaaaaaaaaaaa) Count -> Count -> Count
forall a. Shift a => a -> Count -> a
.>. Count
1)
      x2 :: Count
x2 = (Count
x1 Count -> Count -> Count
forall a. BitWise a => a -> a -> a
.&. Count
0x3333333333333333) Count -> Count -> Count
forall a. Num a => a -> a -> a
+ ((Count
x1 Count -> Count -> Count
forall a. Shift a => a -> Count -> a
.>. Count
2) Count -> Count -> Count
forall a. BitWise a => a -> a -> a
.&. Count
0x3333333333333333)
      x3 :: Count
x3 = (Count
x2 Count -> Count -> Count
forall a. Num a => a -> a -> a
+ (Count
x2 Count -> Count -> Count
forall a. Shift a => a -> Count -> a
.>. Count
4)) Count -> Count -> Count
forall a. BitWise a => a -> a -> a
.&. Count
0x0f0f0f0f0f0f0f0f
  {-# INLINE popCount1 #-}

instance PopCount1 (Builtin Word8) where
  popCount1 :: Builtin Word8 -> Count
popCount1 (Builtin Word8
x0) = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> Int
forall a. Bits a => a -> Int
DB.popCount Word8
x0)
  {-# INLINE popCount1 #-}

instance PopCount1 (Builtin Word16) where
  popCount1 :: Builtin Word16 -> Count
popCount1 (Builtin Word16
x0) = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16 -> Int
forall a. Bits a => a -> Int
DB.popCount Word16
x0)
  {-# INLINE popCount1 #-}

instance PopCount1 (Builtin Word32) where
  popCount1 :: Builtin Word32 -> Count
popCount1 (Builtin Word32
x0) = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32 -> Int
forall a. Bits a => a -> Int
DB.popCount Word32
x0)
  {-# INLINE popCount1 #-}

instance PopCount1 (Builtin Word64) where
  popCount1 :: Builtin Count -> Count
popCount1 (Builtin Count
x0) = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count -> Int
forall a. Bits a => a -> Int
DB.popCount Count
x0)
  {-# INLINE popCount1 #-}

instance PopCount1 Word8 where
  popCount1 :: Word8 -> Count
popCount1 = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count -> Count) -> (Word8 -> Count) -> Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word8 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Word8 -> Count)
-> (Word8 -> Builtin Word8) -> Word8 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Builtin Word8
forall a. a -> Builtin a
fastWord
  {-# INLINE popCount1 #-}

instance PopCount1 Word16 where
  popCount1 :: Word16 -> Count
popCount1 = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count -> Count) -> (Word16 -> Count) -> Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word16 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Word16 -> Count)
-> (Word16 -> Builtin Word16) -> Word16 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Builtin Word16
forall a. a -> Builtin a
fastWord
  {-# INLINE popCount1 #-}

instance PopCount1 Word32 where
  popCount1 :: Word32 -> Count
popCount1 = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count -> Count) -> (Word32 -> Count) -> Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Word32 -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Word32 -> Count)
-> (Word32 -> Builtin Word32) -> Word32 -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Builtin Word32
forall a. a -> Builtin a
fastWord
  {-# INLINE popCount1 #-}

instance PopCount1 Word64 where
  popCount1 :: Count -> Count
popCount1 = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count -> Count) -> (Count -> Count) -> Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin Count -> Count
forall v. PopCount1 v => v -> Count
popCount1 (Builtin Count -> Count)
-> (Count -> Builtin Count) -> Count -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Count -> Builtin Count
forall a. a -> Builtin a
fastWord
  {-# INLINE popCount1 #-}

instance PopCount1 a => PopCount1 [a] where
  popCount1 :: [a] -> Count
popCount1 = [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. PopCount1 v => v -> Count
popCount1
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector Word8) where
  popCount1 :: Vector Word8 -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector Word16) where
  popCount1 :: Vector Word16 -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector Word32) where
  popCount1 :: Vector Word32 -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector Word64) where
  popCount1 :: Vector Count -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector Word8) where
  popCount1 :: Vector Word8 -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector Word16) where
  popCount1 :: Vector Word16 -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector Word32) where
  popCount1 :: Vector Word32 -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector Word64) where
  popCount1 :: Vector Count -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

-- Vector of Builtin instances

instance PopCount1 (DV.Vector (Builtin Word8)) where
  popCount1 :: Vector (Builtin Word8) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector (Builtin Word16)) where
  popCount1 :: Vector (Builtin Word16) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector (Builtin Word32)) where
  popCount1 :: Vector (Builtin Word32) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector (Builtin Word64)) where
  popCount1 :: Vector (Builtin Count) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Builtin Word8)) where
  popCount1 :: Vector (Builtin Word8) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Builtin Word16)) where
  popCount1 :: Vector (Builtin Word16) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Builtin Word32)) where
  popCount1 :: Vector (Builtin Word32) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Builtin Word64)) where
  popCount1 :: Vector (Builtin Count) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

-- Vector of Broadword instances

instance PopCount1 (DV.Vector (Broadword Word8)) where
  popCount1 :: Vector (Broadword Word8) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector (Broadword Word16)) where
  popCount1 :: Vector (Broadword Word16) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector (Broadword Word32)) where
  popCount1 :: Vector (Broadword Word32) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DV.Vector (Broadword Word64)) where
  popCount1 :: Vector (Broadword Count) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Broadword Word8)) where
  popCount1 :: Vector (Broadword Word8) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Broadword Word16)) where
  popCount1 :: Vector (Broadword Word16) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Broadword Word32)) where
  popCount1 :: Vector (Broadword Word32) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVS.Vector (Broadword Word64)) where
  popCount1 :: Vector (Broadword Count) -> Count
popCount1 = (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. PopCount1 v => v -> Count
popCount1) Count
0
  {-# INLINE popCount1 #-}

instance PopCount1 (DVU.Vector Bit.Bit) where
  popCount1 :: Vector Bit -> Count
popCount1 = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Count) -> (Vector Bit -> Int) -> Vector Bit -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Bit -> Int
Bit.countBits
  {-# INLINE popCount1 #-}

instance PopCount1 (DVU.Vector BitTS.Bit) where
  popCount1 :: Vector Bit -> Count
popCount1 = Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Count) -> (Vector Bit -> Int) -> Vector Bit -> Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Bit -> Int
BitTS.countBits
  {-# INLINE popCount1 #-}