hw-bits 0.0.0.2 → 0.0.0.3
raw patch · 10 files changed
+237/−386 lines, 10 filesdep ~attoparsecdep ~conduitdep ~criterionPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: attoparsec, conduit, criterion, deepseq, hspec, resourcet, vector
API changes (from Hackage documentation)
- HaskellWorks.Data.Attoparsec.Final.IsChar: class IsChar c
- HaskellWorks.Data.Attoparsec.Final.IsChar: instance HaskellWorks.Data.Attoparsec.Final.IsChar.IsChar GHC.Types.Char
- HaskellWorks.Data.Attoparsec.Final.IsChar: instance HaskellWorks.Data.Attoparsec.Final.IsChar.IsChar GHC.Word.Word8
- HaskellWorks.Data.Attoparsec.Final.IsChar: toChar :: IsChar c => c -> Char
- HaskellWorks.Data.Attoparsec.Final.Parser: (<?>) :: Parser t => Parser t Char -> String -> Parser t Char
- HaskellWorks.Data.Attoparsec.Final.Parser: char :: Parser t => Char -> Parser t Char
- HaskellWorks.Data.Attoparsec.Final.Parser: class MonoTraversable t => Parser t
- HaskellWorks.Data.Attoparsec.Final.Parser: instance HaskellWorks.Data.Attoparsec.Final.Parser.Parser Data.ByteString.Internal.ByteString
- HaskellWorks.Data.Attoparsec.Final.Parser: instance HaskellWorks.Data.Attoparsec.Final.Parser.Parser Data.Text.Internal.Text
- HaskellWorks.Data.Attoparsec.Final.Parser: rational :: (Parser t, Fractional f) => Parser t f
- HaskellWorks.Data.Attoparsec.Final.Parser: satisfy :: Parser t => (Element t -> Bool) -> Parser t (Element t)
- HaskellWorks.Data.Attoparsec.Final.Parser: satisfyChar :: Parser t => (Char -> Bool) -> Parser t Char
- HaskellWorks.Data.Attoparsec.Final.Parser: satisfyWith :: Parser t => (Element t -> a) -> (a -> Bool) -> Parser t a
- HaskellWorks.Data.Attoparsec.Final.Parser: string :: Parser t => t -> Parser t t
- HaskellWorks.Data.Attoparsec.Final.Parser: try :: Parser t => Parser t a -> Parser t a
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: class PopCount1 v
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word16)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word32)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word64)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word8)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Vector GHC.Word.Word16)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Vector GHC.Word.Word32)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Vector GHC.Word.Word64)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 (Data.Vector.Vector GHC.Word.Word8)
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 GHC.Types.Bool
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 GHC.Word.Word16
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 GHC.Word.Word32
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 GHC.Word.Word64
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 GHC.Word.Word8
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 [GHC.Types.Bool]
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 [GHC.Word.Word16]
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 [GHC.Word.Word32]
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 [GHC.Word.Word64]
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: instance HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword.PopCount1 [GHC.Word.Word8]
- HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword: popCount1 :: PopCount1 v => v -> Count
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: class PopCount1 v
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word16)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word32)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word64)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Storable.Vector GHC.Word.Word8)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Vector GHC.Word.Word16)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Vector GHC.Word.Word32)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Vector GHC.Word.Word64)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 (Data.Vector.Vector GHC.Word.Word8)
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 GHC.Types.Bool
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 GHC.Word.Word16
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 GHC.Word.Word32
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 GHC.Word.Word64
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 GHC.Word.Word8
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 [GHC.Types.Bool]
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 [GHC.Word.Word16]
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 [GHC.Word.Word32]
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 [GHC.Word.Word64]
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: instance HaskellWorks.Data.Bits.PopCount.PopCount1.GHC.PopCount1 [GHC.Word.Word8]
- HaskellWorks.Data.Bits.PopCount.PopCount1.GHC: popCount1 :: PopCount1 v => v -> Count
+ HaskellWorks.Data.Bits.PopCount.PopCount1: class PopCount1 v
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance (HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 a, Foreign.Storable.Storable a) => HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (Data.Vector.Storable.Vector a)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Broadword.Broadword GHC.Word.Word16)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Broadword.Broadword GHC.Word.Word32)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Broadword.Broadword GHC.Word.Word64)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Broadword.Broadword GHC.Word.Word8)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Builtin.Builtin GHC.Word.Word16)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Builtin.Builtin GHC.Word.Word32)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Builtin.Builtin GHC.Word.Word64)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (HaskellWorks.Data.Bits.Types.Builtin.Builtin GHC.Word.Word8)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 GHC.Types.Bool
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 GHC.Word.Word16
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 GHC.Word.Word32
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 GHC.Word.Word64
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 GHC.Word.Word8
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 a => HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 (Data.Vector.Vector a)
+ HaskellWorks.Data.Bits.PopCount.PopCount1: instance HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 a => HaskellWorks.Data.Bits.PopCount.PopCount1.PopCount1 [a]
+ HaskellWorks.Data.Bits.PopCount.PopCount1: popCount1 :: PopCount1 v => v -> Count
+ HaskellWorks.Data.Bits.Types.Broadword: Broadword :: a -> Broadword a
+ HaskellWorks.Data.Bits.Types.Broadword: instance Foreign.Storable.Storable a => Foreign.Storable.Storable (HaskellWorks.Data.Bits.Types.Broadword.Broadword a)
+ HaskellWorks.Data.Bits.Types.Broadword: instance GHC.Classes.Eq a => GHC.Classes.Eq (HaskellWorks.Data.Bits.Types.Broadword.Broadword a)
+ HaskellWorks.Data.Bits.Types.Broadword: instance GHC.Show.Show a => GHC.Show.Show (HaskellWorks.Data.Bits.Types.Broadword.Broadword a)
+ HaskellWorks.Data.Bits.Types.Broadword: newtype Broadword a
+ HaskellWorks.Data.Bits.Types.Builtin: Builtin :: a -> Builtin a
+ HaskellWorks.Data.Bits.Types.Builtin: instance Foreign.Storable.Storable a => Foreign.Storable.Storable (HaskellWorks.Data.Bits.Types.Builtin.Builtin a)
+ HaskellWorks.Data.Bits.Types.Builtin: instance GHC.Classes.Eq a => GHC.Classes.Eq (HaskellWorks.Data.Bits.Types.Builtin.Builtin a)
+ HaskellWorks.Data.Bits.Types.Builtin: instance GHC.Show.Show a => GHC.Show.Show (HaskellWorks.Data.Bits.Types.Builtin.Builtin a)
+ HaskellWorks.Data.Bits.Types.Builtin: newtype Builtin a
Files
- bench/Main.hs +15/−11
- hw-bits.cabal +30/−33
- src/HaskellWorks/Data/Attoparsec/Final/IsChar.hs +0/−15
- src/HaskellWorks/Data/Attoparsec/Final/Parser.hs +0/−42
- src/HaskellWorks/Data/Bits/PopCount/PopCount1.hs +101/−2
- src/HaskellWorks/Data/Bits/PopCount/PopCount1/Broadword.hs +0/−111
- src/HaskellWorks/Data/Bits/PopCount/PopCount1/GHC.hs +0/−95
- src/HaskellWorks/Data/Bits/Types/Broadword.hs +7/−0
- src/HaskellWorks/Data/Bits/Types/Builtin.hs +7/−0
- src/HaskellWorks/Data/Vector/VectorLike.hs +77/−77
bench/Main.hs view
@@ -1,20 +1,24 @@ module Main where import Criterion.Main-import qualified Data.ByteString as BS--setupEnvBs :: Int -> IO BS.ByteString-setupEnvBs n = return $ BS.pack (take n (cycle [maxBound, 0]))+import qualified Data.Vector.Storable as DVS+import Data.Word+import HaskellWorks.Data.Bits.PopCount.PopCount1+import HaskellWorks.Data.Bits.Types.Broadword+import HaskellWorks.Data.Bits.Types.Builtin+import HaskellWorks.Data.Positioning -setupEnvBss :: Int -> Int -> IO [BS.ByteString]-setupEnvBss n k = setupEnvBs n >>= \v -> return (replicate k v)+setupEnvVector :: Int -> IO (DVS.Vector Word64)+setupEnvVector n = return $ DVS.fromList (take n (cycle [maxBound, 0])) -benchIdentity :: [Benchmark]-benchIdentity =- [ env (setupEnvBss 4060 19968) $ \_ -> bgroup "Rank"- [ bench "Rechunk" (whnf id "")+benchPopCount1 :: [Benchmark]+benchPopCount1 =+ [ env (setupEnvVector 1000000) $ \bv -> bgroup "PopCount1"+ [ bench "Broadword" (nf (map (\n -> getCount (popCount1 (DVS.take n (DVS.unsafeCast bv :: DVS.Vector (Broadword Word64)))))) [0, 1000..100000])+ , bench "Builtin" (nf (map (\n -> getCount (popCount1 (DVS.take n (DVS.unsafeCast bv :: DVS.Vector (Builtin Word64)))))) [0, 1000..100000])+ , bench "Default" (nf (map (\n -> getCount (popCount1 (DVS.take n (DVS.unsafeCast bv :: DVS.Vector Word64 ))))) [0, 1000..100000]) ] ] main :: IO ()-main = defaultMain benchIdentity+main = defaultMain benchPopCount1
hw-bits.cabal view
@@ -1,5 +1,5 @@ name: hw-bits-version: 0.0.0.2+version: 0.0.0.3 synopsis: Conduits for tokenizing streams. description: Please see README.md homepage: http://github.com/haskell-works/hw-bits#readme@@ -18,21 +18,19 @@ hs-source-dirs: app main-is: Main.hs ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall -msse4.2- build-depends: base >= 4 && < 5 ,- bytestring ,- conduit ,- criterion >= 1.1.0.0 && < 1.2 ,- hw-bits ,- mmap ,- resourcet ,- vector >= 0.6 && < 0.12+ build-depends: base >= 4 && < 5+ , bytestring+ , conduit+ , criterion+ , hw-bits+ , mmap+ , resourcet+ , vector default-language: Haskell2010 library hs-source-dirs: src- exposed-modules: HaskellWorks.Data.Attoparsec.Final.IsChar- , HaskellWorks.Data.Attoparsec.Final.Parser- , HaskellWorks.Data.Bits+ exposed-modules: HaskellWorks.Data.Bits , HaskellWorks.Data.Bits.BitLength , HaskellWorks.Data.Bits.BitParse , HaskellWorks.Data.Bits.BitRead@@ -44,8 +42,8 @@ , HaskellWorks.Data.Bits.PopCount , HaskellWorks.Data.Bits.PopCount.PopCount0 , HaskellWorks.Data.Bits.PopCount.PopCount1- , HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword- , HaskellWorks.Data.Bits.PopCount.PopCount1.GHC+ , HaskellWorks.Data.Bits.Types.Broadword+ , HaskellWorks.Data.Bits.Types.Builtin , HaskellWorks.Data.ByteString , HaskellWorks.Data.FromByteString , HaskellWorks.Data.FromForeignRegion@@ -57,10 +55,10 @@ , HaskellWorks.Data.Word build-depends: base >= 4.7 && < 5 , array- , attoparsec >= 0.10+ , attoparsec , bytestring- , conduit >= 1.1 && < 1.3- , deepseq < 1.5+ , conduit+ , deepseq , ghc-prim , lens , mmap@@ -68,14 +66,14 @@ , parsec , QuickCheck , random- , resourcet >= 1.1+ , resourcet , safe , text , vector , word8 default-language: Haskell2010- ghc-options: -rtsopts -with-rtsopts=-N -Wall -O2 -Wall -msse4.2+ ghc-options: -rtsopts -with-rtsopts=-N -Wall -O2 -msse4.2 test-suite hw-bits-test type: exitcode-stdio-1.0@@ -84,15 +82,15 @@ other-modules: HaskellWorks.Data.Bits.BitReadSpec , HaskellWorks.Data.Bits.BitWiseSpec build-depends: base- , attoparsec >= 0.10+ , attoparsec , bytestring- , conduit >= 1.1 && < 1.3- , hspec >= 1.3+ , conduit+ , hspec , hw-bits , mmap , parsec , QuickCheck- , resourcet >= 1.1+ , resourcet , transformers , vector ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall@@ -106,14 +104,13 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: bench Main-Is: Main.hs- GHC-Options: -O2 -Wall -msse4.2+ GHC-Options: -Wall -O2 -msse4.2 Default-Language: Haskell2010- Build-Depends:- base >= 4 && < 5 ,- bytestring ,- conduit ,- criterion >= 1.1.0.0 && < 1.2 ,- hw-bits ,- mmap ,- resourcet ,- vector >= 0.6 && < 0.12+ Build-Depends: base >= 4 && < 5+ , bytestring+ , conduit+ , criterion+ , hw-bits+ , mmap+ , resourcet+ , vector
− src/HaskellWorks/Data/Attoparsec/Final/IsChar.hs
@@ -1,15 +0,0 @@-module HaskellWorks.Data.Attoparsec.Final.IsChar- ( IsChar(..)- ) where--import qualified Data.ByteString.Internal as BI-import Data.Word8--class IsChar c where- toChar :: c -> Char--instance IsChar Word8 where- toChar = BI.w2c--instance IsChar Char where- toChar = id
− src/HaskellWorks/Data/Attoparsec/Final/Parser.hs
@@ -1,42 +0,0 @@-module HaskellWorks.Data.Attoparsec.Final.Parser- ( Parser(..)- ) where--import qualified Data.Attoparsec.ByteString as ABS-import qualified Data.Attoparsec.ByteString.Char8 as BC-import qualified Data.Attoparsec.Text as AT-import qualified Data.Attoparsec.Types as T-import Data.ByteString (ByteString)-import Data.MonoTraversable-import Data.Text (Text)-import HaskellWorks.Data.Attoparsec.Final.IsChar--class MonoTraversable t => Parser t where- satisfy :: (Element t -> Bool) -> T.Parser t (Element t)- satisfyWith :: (Element t -> a) -> (a -> Bool) -> T.Parser t a- satisfyChar :: (Char -> Bool) -> T.Parser t Char- string :: t -> T.Parser t t- try :: T.Parser t a -> T.Parser t a- char :: Char -> T.Parser t Char- (<?>) :: T.Parser t Char -> String -> T.Parser t Char- rational :: Fractional f => T.Parser t f--instance Parser ByteString where- satisfy = ABS.satisfy- satisfyWith = ABS.satisfyWith- satisfyChar = ABS.satisfyWith toChar- string = ABS.string- try = ABS.try- char = BC.char- (<?>) = (BC.<?>)- rational = BC.rational--instance Parser Text where- satisfy = AT.satisfy- satisfyWith = AT.satisfyWith- satisfyChar = AT.satisfyWith toChar- string = AT.string- try = AT.try- char = AT.char- (<?>) = (AT.<?>)- rational = AT.rational
src/HaskellWorks/Data/Bits/PopCount/PopCount1.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE FlexibleInstances #-} -- | -- Copyright: 2016 John Ky@@ -5,7 +6,105 @@ -- -- Succinct operations. module HaskellWorks.Data.Bits.PopCount.PopCount1- ( module X+ ( PopCount1(..) ) where -import HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword as X+import qualified Data.Bits as DB+import qualified Data.Vector as DV+import qualified Data.Vector.Storable as DVS+import Data.Word+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Bits.Types.Broadword+import HaskellWorks.Data.Bits.Types.Builtin+import HaskellWorks.Data.Positioning+import Prelude as P++type FastWord a = Builtin a++fastWord :: a -> FastWord a+fastWord = Builtin+{-# INLINE fastWord #-}++class PopCount1 v where+ popCount1 :: v -> Count++instance PopCount1 Bool where+ popCount1 True = 1+ popCount1 False = 0+ {-# INLINE popCount1 #-}++instance PopCount1 (Broadword Word8) where+ popCount1 (Broadword x0) = Count (fromIntegral x3)+ where+ x1 = x0 - ((x0 .&. 0xaa) .>. 1)+ x2 = (x1 .&. 0x33) + ((x1 .>. 2) .&. 0x33)+ x3 = (x2 + (x2 .>. 4)) .&. 0x0f+ {-# INLINE popCount1 #-}++instance PopCount1 (Broadword Word16) where+ popCount1 (Broadword x0) = Count (fromIntegral ((x3 * 0x0101) .>. 8))+ where+ x1 = x0 - ((x0 .&. 0xaaaa) .>. 1)+ x2 = (x1 .&. 0x3333) + ((x1 .>. 2) .&. 0x3333)+ x3 = (x2 + (x2 .>. 4)) .&. 0x0f0f+ {-# INLINE popCount1 #-}++instance PopCount1 (Broadword Word32) where+ popCount1 (Broadword x0) = Count (fromIntegral ((x3 * 0x01010101) .>. 24))+ where+ x1 = x0 - ((x0 .&. 0xaaaaaaaa) .>. 1)+ x2 = (x1 .&. 0x33333333) + ((x1 .>. 2) .&. 0x33333333)+ x3 = (x2 + (x2 .>. 4)) .&. 0x0f0f0f0f+ {-# INLINE popCount1 #-}++instance PopCount1 (Broadword Word64) where+ popCount1 (Broadword x0) = Count ((x3 * 0x0101010101010101) .>. 56)+ where+ x1 = x0 - ((x0 .&. 0xaaaaaaaaaaaaaaaa) .>. 1)+ x2 = (x1 .&. 0x3333333333333333) + ((x1 .>. 2) .&. 0x3333333333333333)+ x3 = (x2 + (x2 .>. 4)) .&. 0x0f0f0f0f0f0f0f0f+ {-# INLINE popCount1 #-}++instance PopCount1 (Builtin Word8) where+ popCount1 (Builtin x0) = fromIntegral (DB.popCount x0)+ {-# INLINE popCount1 #-}++instance PopCount1 (Builtin Word16) where+ popCount1 (Builtin x0) = fromIntegral (DB.popCount x0)+ {-# INLINE popCount1 #-}++instance PopCount1 (Builtin Word32) where+ popCount1 (Builtin x0) = fromIntegral (DB.popCount x0)+ {-# INLINE popCount1 #-}++instance PopCount1 (Builtin Word64) where+ popCount1 (Builtin x0) = fromIntegral (DB.popCount x0)+ {-# INLINE popCount1 #-}++instance PopCount1 Word8 where+ popCount1 = fromIntegral . popCount1 . fastWord+ {-# INLINE popCount1 #-}++instance PopCount1 Word16 where+ popCount1 = fromIntegral . popCount1 . fastWord+ {-# INLINE popCount1 #-}++instance PopCount1 Word32 where+ popCount1 = fromIntegral . popCount1 . fastWord+ {-# INLINE popCount1 #-}++instance PopCount1 Word64 where+ popCount1 = fromIntegral . popCount1 . fastWord+ {-# INLINE popCount1 #-}++instance PopCount1 a => PopCount1 [a] where+ popCount1 = P.sum . fmap popCount1+ {-# INLINE popCount1 #-}++instance PopCount1 a => PopCount1 (DV.Vector a) where+ popCount1 = DV.foldl (\c -> (c +) . popCount1) 0+ {-# INLINE popCount1 #-}++instance (PopCount1 a, DVS.Storable a) => PopCount1 (DVS.Vector a) where+ popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0+ {-# INLINE popCount1 #-}
− src/HaskellWorks/Data/Bits/PopCount/PopCount1/Broadword.hs
@@ -1,111 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Copyright: 2016 John Ky--- License: MIT------ Succinct operations.-module HaskellWorks.Data.Bits.PopCount.PopCount1.Broadword- ( PopCount1(..)- ) where--import qualified Data.Vector as DV-import qualified Data.Vector.Storable as DVS-import Data.Word-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.Positioning-import Prelude as P--class PopCount1 v where- popCount1 :: v -> Count--instance PopCount1 Bool where- popCount1 True = 1- popCount1 False = 0- {-# INLINABLE popCount1 #-}--instance PopCount1 Word8 where- popCount1 x0 = Count (fromIntegral x3)- where- x1 = x0 - ((x0 .&. 0xaa) .>. 1)- x2 = (x1 .&. 0x33) + ((x1 .>. 2) .&. 0x33)- x3 = (x2 + (x2 .>. 4)) .&. 0x0f- {-# INLINABLE popCount1 #-}--instance PopCount1 Word16 where- popCount1 x0 = Count (fromIntegral ((x3 * 0x0101) .>. 8))- where- x1 = x0 - ((x0 .&. 0xaaaa) .>. 1)- x2 = (x1 .&. 0x3333) + ((x1 .>. 2) .&. 0x3333)- x3 = (x2 + (x2 .>. 4)) .&. 0x0f0f- {-# INLINABLE popCount1 #-}--instance PopCount1 Word32 where- popCount1 x0 = Count (fromIntegral ((x3 * 0x01010101) .>. 24))- where- x1 = x0 - ((x0 .&. 0xaaaaaaaa) .>. 1)- x2 = (x1 .&. 0x33333333) + ((x1 .>. 2) .&. 0x33333333)- x3 = (x2 + (x2 .>. 4)) .&. 0x0f0f0f0f- {-# INLINABLE popCount1 #-}--instance PopCount1 Word64 where- popCount1 x0 = Count ((x3 * 0x0101010101010101) .>. 56)- where- x1 = x0 - ((x0 .&. 0xaaaaaaaaaaaaaaaa) .>. 1)- x2 = (x1 .&. 0x3333333333333333) + ((x1 .>. 2) .&. 0x3333333333333333)- x3 = (x2 + (x2 .>. 4)) .&. 0x0f0f0f0f0f0f0f0f- {-# INLINABLE popCount1 #-}--instance PopCount1 [Bool] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word8] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word16] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word32] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word64] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word8) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word16) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word32) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word64) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word8) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word16) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word32) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word64) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}
− src/HaskellWorks/Data/Bits/PopCount/PopCount1/GHC.hs
@@ -1,95 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Copyright: 2016 John Ky--- License: MIT------ Succinct operations.-module HaskellWorks.Data.Bits.PopCount.PopCount1.GHC- ( PopCount1(..)- ) where--import qualified Data.Bits as DB-import qualified Data.Vector as DV-import qualified Data.Vector.Storable as DVS-import Data.Word-import HaskellWorks.Data.Positioning-import Prelude as P--class PopCount1 v where- popCount1 :: v -> Count--instance PopCount1 Bool where- popCount1 True = 1- popCount1 False = 0- {-# INLINABLE popCount1 #-}--instance PopCount1 Word8 where- popCount1 = fromIntegral . DB.popCount- {-# INLINABLE popCount1 #-}--instance PopCount1 Word16 where- popCount1 = fromIntegral . DB.popCount- {-# INLINABLE popCount1 #-}--instance PopCount1 Word32 where- popCount1 = fromIntegral . DB.popCount- {-# INLINABLE popCount1 #-}--instance PopCount1 Word64 where- popCount1 = fromIntegral . DB.popCount- {-# INLINABLE popCount1 #-}--instance PopCount1 [Bool] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word8] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word16] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word32] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 [Word64] where- popCount1 = P.sum . fmap popCount1- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word8) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word16) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word32) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DV.Vector Word64) where- popCount1 = DV.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word8) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word16) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word32) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}--instance PopCount1 (DVS.Vector Word64) where- popCount1 = DVS.foldl (\c -> (c +) . popCount1) 0- {-# INLINABLE popCount1 #-}
+ src/HaskellWorks/Data/Bits/Types/Broadword.hs view
@@ -0,0 +1,7 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++module HaskellWorks.Data.Bits.Types.Broadword where++import Data.Vector.Storable++newtype Broadword a = Broadword a deriving (Eq, Show, Storable)
+ src/HaskellWorks/Data/Bits/Types/Builtin.hs view
@@ -0,0 +1,7 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++module HaskellWorks.Data.Bits.Types.Builtin where++import Data.Vector.Storable++newtype Builtin a = Builtin a deriving (Eq, Show, Storable)
src/HaskellWorks/Data/Vector/VectorLike.hs view
@@ -43,19 +43,19 @@ vTake = take . fromIntegral vIndex v (Position i) = v !! fromIntegral i vSlice (Position i) (Position j) = take (fromIntegral j) . drop (fromIntegral i)- {-# INLINABLE vToList #-}+ {-# INLINABLE vToList #-} {-# INLINABLE vFromList #-}- {-# INLINABLE (!!!) #-}- {-# INLINABLE vConcat #-}- {-# INLINABLE vEmpty #-}- {-# INLINABLE vFilter #-}+ {-# INLINABLE (!!!) #-}+ {-# INLINABLE vConcat #-}+ {-# INLINABLE vEmpty #-}+ {-# INLINABLE vFilter #-} {-# INLINABLE vGenerate #-}- {-# INLINABLE vLength #-}- {-# INLINABLE vSnoc #-}- {-# INLINABLE vDrop #-}- {-# INLINABLE vTake #-}- {-# INLINABLE vIndex #-}- {-# INLINABLE vSlice #-}+ {-# INLINABLE vLength #-}+ {-# INLINABLE vSnoc #-}+ {-# INLINABLE vDrop #-}+ {-# INLINABLE vTake #-}+ {-# INLINABLE vIndex #-}+ {-# INLINABLE vSlice #-} instance VectorLike BS.ByteString where type Elem BS.ByteString = Word8@@ -74,19 +74,19 @@ vTake = BS.take . fromIntegral vIndex v (Position i) = BS.index v (fromIntegral i) vSlice (Position i) (Position j) = BS.take (fromIntegral j) . BS.drop (fromIntegral i)- {-# INLINABLE vToList #-}+ {-# INLINABLE vToList #-} {-# INLINABLE vFromList #-}- {-# INLINABLE (!!!) #-}- {-# INLINABLE vConcat #-}- {-# INLINABLE vEmpty #-}- {-# INLINABLE vFilter #-}+ {-# INLINABLE (!!!) #-}+ {-# INLINABLE vConcat #-}+ {-# INLINABLE vEmpty #-}+ {-# INLINABLE vFilter #-} {-# INLINABLE vGenerate #-}- {-# INLINABLE vLength #-}- {-# INLINABLE vSnoc #-}- {-# INLINABLE vDrop #-}- {-# INLINABLE vTake #-}- {-# INLINABLE vIndex #-}- {-# INLINABLE vSlice #-}+ {-# INLINABLE vLength #-}+ {-# INLINABLE vSnoc #-}+ {-# INLINABLE vDrop #-}+ {-# INLINABLE vTake #-}+ {-# INLINABLE vIndex #-}+ {-# INLINABLE vSlice #-} instance VectorLike (DV.Vector Word8) where type Elem (DV.Vector Word8) = Word8@@ -104,19 +104,19 @@ vTake = DV.take . fromIntegral vIndex v (Position i) = DV.unsafeIndex v (fromIntegral i) vSlice (Position i) (Position j) = DV.unsafeSlice (fromIntegral i) (fromIntegral j)- {-# INLINABLE vToList #-}+ {-# INLINABLE vToList #-} {-# INLINABLE vFromList #-}- {-# INLINABLE (!!!) #-}- {-# INLINABLE vConcat #-}- {-# INLINABLE vEmpty #-}- {-# INLINABLE vFilter #-}+ {-# INLINABLE (!!!) #-}+ {-# INLINABLE vConcat #-}+ {-# INLINABLE vEmpty #-}+ {-# INLINABLE vFilter #-} {-# INLINABLE vGenerate #-}- {-# INLINABLE vLength #-}- {-# INLINABLE vSnoc #-}- {-# INLINABLE vDrop #-}- {-# INLINABLE vTake #-}- {-# INLINABLE vIndex #-}- {-# INLINABLE vSlice #-}+ {-# INLINABLE vLength #-}+ {-# INLINABLE vSnoc #-}+ {-# INLINABLE vDrop #-}+ {-# INLINABLE vTake #-}+ {-# INLINABLE vIndex #-}+ {-# INLINABLE vSlice #-} instance VectorLike (DV.Vector Word16) where type Elem (DV.Vector Word16) = Word16@@ -134,19 +134,19 @@ vTake = DV.take . fromIntegral vIndex v (Position i) = DV.unsafeIndex v (fromIntegral i) vSlice (Position i) (Position j) = DV.unsafeSlice (fromIntegral i) (fromIntegral j)- {-# INLINABLE vToList #-}+ {-# INLINABLE vToList #-} {-# INLINABLE vFromList #-}- {-# INLINABLE (!!!) #-}- {-# INLINABLE vConcat #-}- {-# INLINABLE vEmpty #-}- {-# INLINABLE vFilter #-}+ {-# INLINABLE (!!!) #-}+ {-# INLINABLE vConcat #-}+ {-# INLINABLE vEmpty #-}+ {-# INLINABLE vFilter #-} {-# INLINABLE vGenerate #-}- {-# INLINABLE vLength #-}- {-# INLINABLE vSnoc #-}- {-# INLINABLE vDrop #-}- {-# INLINABLE vTake #-}- {-# INLINABLE vIndex #-}- {-# INLINABLE vSlice #-}+ {-# INLINABLE vLength #-}+ {-# INLINABLE vSnoc #-}+ {-# INLINABLE vDrop #-}+ {-# INLINABLE vTake #-}+ {-# INLINABLE vIndex #-}+ {-# INLINABLE vSlice #-} instance VectorLike (DV.Vector Word32) where type Elem (DV.Vector Word32) = Word32@@ -164,19 +164,19 @@ vTake = DV.take . fromIntegral vIndex v (Position i) = DV.unsafeIndex v (fromIntegral i) vSlice (Position i) (Position j) = DV.unsafeSlice (fromIntegral i) (fromIntegral j)- {-# INLINABLE vToList #-}+ {-# INLINABLE vToList #-} {-# INLINABLE vFromList #-}- {-# INLINABLE (!!!) #-}- {-# INLINABLE vConcat #-}- {-# INLINABLE vEmpty #-}- {-# INLINABLE vFilter #-}+ {-# INLINABLE (!!!) #-}+ {-# INLINABLE vConcat #-}+ {-# INLINABLE vEmpty #-}+ {-# INLINABLE vFilter #-} {-# INLINABLE vGenerate #-}- {-# INLINABLE vLength #-}- {-# INLINABLE vSnoc #-}- {-# INLINABLE vDrop #-}- {-# INLINABLE vTake #-}- {-# INLINABLE vIndex #-}- {-# INLINABLE vSlice #-}+ {-# INLINABLE vLength #-}+ {-# INLINABLE vSnoc #-}+ {-# INLINABLE vDrop #-}+ {-# INLINABLE vTake #-}+ {-# INLINABLE vIndex #-}+ {-# INLINABLE vSlice #-} instance VectorLike (DV.Vector Word64) where type Elem (DV.Vector Word64) = Word64@@ -194,19 +194,19 @@ vTake = DV.take . fromIntegral vIndex v (Position i) = DV.unsafeIndex v (fromIntegral i) vSlice (Position i) (Position j) = DV.unsafeSlice (fromIntegral i) (fromIntegral j)- {-# INLINABLE vToList #-}+ {-# INLINABLE vToList #-} {-# INLINABLE vFromList #-}- {-# INLINABLE (!!!) #-}- {-# INLINABLE vConcat #-}- {-# INLINABLE vEmpty #-}- {-# INLINABLE vFilter #-}+ {-# INLINABLE (!!!) #-}+ {-# INLINABLE vConcat #-}+ {-# INLINABLE vEmpty #-}+ {-# INLINABLE vFilter #-} {-# INLINABLE vGenerate #-}- {-# INLINABLE vLength #-}- {-# INLINABLE vSnoc #-}- {-# INLINABLE vDrop #-}- {-# INLINABLE vTake #-}- {-# INLINABLE vIndex #-}- {-# INLINABLE vSlice #-}+ {-# INLINABLE vLength #-}+ {-# INLINABLE vSnoc #-}+ {-# INLINABLE vDrop #-}+ {-# INLINABLE vTake #-}+ {-# INLINABLE vIndex #-}+ {-# INLINABLE vSlice #-} instance VectorLike (DVS.Vector Word8) where type Elem (DVS.Vector Word8) = Word8@@ -224,19 +224,19 @@ vTake = DVS.take . fromIntegral vIndex v (Position i) = DVS.unsafeIndex v (fromIntegral i) vSlice (Position i) (Position j) = DVS.unsafeSlice (fromIntegral i) (fromIntegral j)- {-# INLINABLE vToList #-}+ {-# INLINABLE vToList #-} {-# INLINABLE vFromList #-}- {-# INLINABLE (!!!) #-}- {-# INLINABLE vConcat #-}- {-# INLINABLE vEmpty #-}- {-# INLINABLE vFilter #-}+ {-# INLINABLE (!!!) #-}+ {-# INLINABLE vConcat #-}+ {-# INLINABLE vEmpty #-}+ {-# INLINABLE vFilter #-} {-# INLINABLE vGenerate #-}- {-# INLINABLE vLength #-}- {-# INLINABLE vSnoc #-}- {-# INLINABLE vDrop #-}- {-# INLINABLE vTake #-}- {-# INLINABLE vIndex #-}- {-# INLINABLE vSlice #-}+ {-# INLINABLE vLength #-}+ {-# INLINABLE vSnoc #-}+ {-# INLINABLE vDrop #-}+ {-# INLINABLE vTake #-}+ {-# INLINABLE vIndex #-}+ {-# INLINABLE vSlice #-} instance VectorLike (DVS.Vector Word16) where type Elem (DVS.Vector Word16) = Word16