packages feed

crc (empty) → 0.0.1

raw patch · 10 files changed

+692/−0 lines, 10 filesdep +basedep +bytestringdep +conduitsetup-changed

Dependencies added: base, bytestring, conduit, conduit-extra, crc, criterion, resourcet, tasty, tasty-golden, vector

Files

+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Michael Xavier (c) 2015++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Michael Xavier nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ bench/Main.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}+module Main+    ( main+    ) where+++-------------------------------------------------------------------------------+import           Criterion+import           Criterion.Main+import           Data.ByteString   (ByteString)+import           Data.Proxy+-------------------------------------------------------------------------------+import           Data.Digest.CRC+import           Data.Digest.CRC16+import           Data.Digest.CRC32+import           Data.Digest.CRC64+import           Data.Digest.CRC8+-------------------------------------------------------------------------------+++main :: IO ()+main = defaultMain+  [ digestBenchmarks+  ]+++-------------------------------------------------------------------------------+digestBenchmarks :: Benchmark+digestBenchmarks = bgroup "digest"+  [ bench "CRC8" (digestBench (Proxy :: Proxy CRC8) )+  , bench "CRC16" (digestBench (Proxy :: Proxy CRC16))+  , bench "CRC32" (digestBench (Proxy :: Proxy CRC32))+  , bench "CRC64" (digestBench (Proxy :: Proxy CRC64))+  ]+++-------------------------------------------------------------------------------+example :: ByteString+example = "1234567890"+++-------------------------------------------------------------------------------+digestBench :: forall a. (CRC a) => Proxy a -> Benchmarkable+digestBench _ = whnf (digest :: ByteString -> a) example
+ crc.cabal view
@@ -0,0 +1,78 @@+name:                crc+version:             0.0.1+synopsis:            Implements various Cyclic Redundancy Checks (CRC)+description:         Please see README.md+homepage:            http://github.com/MichaelXavier/crc#readme+license:             MIT+license-file:        LICENSE+author:              Michael Xavier+maintainer:          michael@michaelxavier.net+copyright:           2015 Michael Xavier+category:            Web+build-type:          Simple+-- extra-source-files:+cabal-version:       >=1.10++flag lib-Werror+  default: False+  manual: True++library+  hs-source-dirs:      src+  exposed-modules:     Data.Digest.CRC+                     , Data.Digest.CRC8+                     , Data.Digest.CRC16+                     , Data.Digest.CRC32+                     , Data.Digest.CRC64+  build-depends:       base >= 4.7 && < 5+                     , bytestring+                     , vector+  default-language:    Haskell2010++  if flag(lib-Werror)+    ghc-options: -Werror++  ghc-options: -Wall+++test-suite test+  type:                exitcode-stdio-1.0+  hs-source-dirs:      test+  main-is:             Main.hs+  build-depends:       base+                     , crc+                     , tasty+                     , tasty-golden+                     , conduit+                     , conduit-extra+                     , bytestring+                     , resourcet+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N+  default-language:    Haskell2010++  if flag(lib-Werror)+    ghc-options: -Werror++  ghc-options: -Wall+++benchmark bench+  type: exitcode-stdio-1.0+  main-is: Main.hs+  hs-source-dirs: bench+  default-language:    Haskell2010+  build-depends:+      base+    , crc+    , criterion+    , bytestring++  if flag(lib-Werror)+    ghc-options: -Werror++  ghc-options: -Wall+++source-repository head+  type:     git+  location: https://github.com/MichaelXavier/crc
+ src/Data/Digest/CRC.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE TypeFamilies #-}+module Data.Digest.CRC+    ( CRC(..)+    , digest+    ) where+++-------------------------------------------------------------------------------+import           Data.ByteString     as BS+import           Data.Vector.Unboxed as V+-------------------------------------------------------------------------------+-------------------------------------------------------------------------------++++class CRC a where+  type CRCWord a+  initCRC :: a+  crcWord :: a -> CRCWord a+  updateDigest :: a -> ByteString -> a+  crcTable :: V.Vector (CRCWord a)+++digest :: CRC a => ByteString -> a+digest = updateDigest initCRC
+ src/Data/Digest/CRC16.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE TypeFamilies #-}+module Data.Digest.CRC16+    ( CRC16(..)+    ) where+++-------------------------------------------------------------------------------+import           Data.Bits+import           Data.ByteString     as BS+import           Data.Vector.Unboxed as V+import           Data.Word+-------------------------------------------------------------------------------+import           Data.Digest.CRC+-------------------------------------------------------------------------------+++newtype CRC16 = CRC16 { crc16 :: Word16 } deriving (Show, Eq, Ord)+++instance CRC CRC16 where+  type CRCWord CRC16 = Word16+  initCRC = CRC16 0+  crcWord = crc16+  updateDigest = updateDigest16+  crcTable = table+++-------------------------------------------------------------------------------+updateDigest16 :: CRC16 -> ByteString -> CRC16+updateDigest16 crc = BS.foldl go crc+  where+    go (CRC16 crc') b8 =+      let idx = fromIntegral (crc' `xor` b16) .&. 0xff+          b16 = fromIntegral b8+      in CRC16 ((table ! idx) `xor` ((crc' `shiftR` 8) .&. 0x00ffff))+++-------------------------------------------------------------------------------+table :: V.Vector Word16+table = V.fromList+  [ 0x0000, 0xc0c1, 0xc181, 0x0140+  , 0xc301, 0x03c0, 0x0280, 0xc241+  , 0xc601, 0x06c0, 0x0780, 0xc741+  , 0x0500, 0xc5c1, 0xc481, 0x0440+  , 0xcc01, 0x0cc0, 0x0d80, 0xcd41+  , 0x0f00, 0xcfc1, 0xce81, 0x0e40+  , 0x0a00, 0xcac1, 0xcb81, 0x0b40+  , 0xc901, 0x09c0, 0x0880, 0xc841+  , 0xd801, 0x18c0, 0x1980, 0xd941+  , 0x1b00, 0xdbc1, 0xda81, 0x1a40+  , 0x1e00, 0xdec1, 0xdf81, 0x1f40+  , 0xdd01, 0x1dc0, 0x1c80, 0xdc41+  , 0x1400, 0xd4c1, 0xd581, 0x1540+  , 0xd701, 0x17c0, 0x1680, 0xd641+  , 0xd201, 0x12c0, 0x1380, 0xd341+  , 0x1100, 0xd1c1, 0xd081, 0x1040+  , 0xf001, 0x30c0, 0x3180, 0xf141+  , 0x3300, 0xf3c1, 0xf281, 0x3240+  , 0x3600, 0xf6c1, 0xf781, 0x3740+  , 0xf501, 0x35c0, 0x3480, 0xf441+  , 0x3c00, 0xfcc1, 0xfd81, 0x3d40+  , 0xff01, 0x3fc0, 0x3e80, 0xfe41+  , 0xfa01, 0x3ac0, 0x3b80, 0xfb41+  , 0x3900, 0xf9c1, 0xf881, 0x3840+  , 0x2800, 0xe8c1, 0xe981, 0x2940+  , 0xeb01, 0x2bc0, 0x2a80, 0xea41+  , 0xee01, 0x2ec0, 0x2f80, 0xef41+  , 0x2d00, 0xedc1, 0xec81, 0x2c40+  , 0xe401, 0x24c0, 0x2580, 0xe541+  , 0x2700, 0xe7c1, 0xe681, 0x2640+  , 0x2200, 0xe2c1, 0xe381, 0x2340+  , 0xe101, 0x21c0, 0x2080, 0xe041+  , 0xa001, 0x60c0, 0x6180, 0xa141+  , 0x6300, 0xa3c1, 0xa281, 0x6240+  , 0x6600, 0xa6c1, 0xa781, 0x6740+  , 0xa501, 0x65c0, 0x6480, 0xa441+  , 0x6c00, 0xacc1, 0xad81, 0x6d40+  , 0xaf01, 0x6fc0, 0x6e80, 0xae41+  , 0xaa01, 0x6ac0, 0x6b80, 0xab41+  , 0x6900, 0xa9c1, 0xa881, 0x6840+  , 0x7800, 0xb8c1, 0xb981, 0x7940+  , 0xbb01, 0x7bc0, 0x7a80, 0xba41+  , 0xbe01, 0x7ec0, 0x7f80, 0xbf41+  , 0x7d00, 0xbdc1, 0xbc81, 0x7c40+  , 0xb401, 0x74c0, 0x7580, 0xb541+  , 0x7700, 0xb7c1, 0xb681, 0x7640+  , 0x7200, 0xb2c1, 0xb381, 0x7340+  , 0xb101, 0x71c0, 0x7080, 0xb041+  , 0x5000, 0x90c1, 0x9181, 0x5140+  , 0x9301, 0x53c0, 0x5280, 0x9241+  , 0x9601, 0x56c0, 0x5780, 0x9741+  , 0x5500, 0x95c1, 0x9481, 0x5440+  , 0x9c01, 0x5cc0, 0x5d80, 0x9d41+  , 0x5f00, 0x9fc1, 0x9e81, 0x5e40+  , 0x5a00, 0x9ac1, 0x9b81, 0x5b40+  , 0x9901, 0x59c0, 0x5880, 0x9841+  , 0x8801, 0x48c0, 0x4980, 0x8941+  , 0x4b00, 0x8bc1, 0x8a81, 0x4a40+  , 0x4e00, 0x8ec1, 0x8f81, 0x4f40+  , 0x8d01, 0x4dc0, 0x4c80, 0x8c41+  , 0x4400, 0x84c1, 0x8581, 0x4540+  , 0x8701, 0x47c0, 0x4680, 0x8641+  , 0x8201, 0x42c0, 0x4380, 0x8341+  , 0x4100, 0x81c1, 0x8081, 0x4040+  ]
+ src/Data/Digest/CRC32.hs view
@@ -0,0 +1,108 @@+{-# LANGUAGE TypeFamilies #-}+module Data.Digest.CRC32+    ( CRC32(..)+    , digest+    , updateDigest+    ) where+++-------------------------------------------------------------------------------+import           Data.Bits+import           Data.ByteString     as BS+import           Data.Vector.Unboxed as V+import           Data.Word+-------------------------------------------------------------------------------+import           Data.Digest.CRC+-------------------------------------------------------------------------------+++newtype CRC32 = CRC32 { crc32 :: Word32 } deriving (Show, Eq, Ord)+++instance CRC CRC32 where+  type CRCWord CRC32 = Word32+  initCRC = CRC32 0xffffffff+  crcWord = crc32+  updateDigest = updateDigest32+  crcTable = table+++-------------------------------------------------------------------------------+updateDigest32 :: CRC32 -> ByteString -> CRC32+updateDigest32 crc = xorFinal . BS.foldl go crc+  where+    xorFinal (CRC32 x) = CRC32 (x `xor` 0xffffffff)+    go (CRC32 crc') b8 =+      let idx = fromIntegral (crc' `xor` b32) .&. 0xff+          b32 = fromIntegral b8+      in CRC32 (((crc' `shiftR` 8) .&. 0x00ffffff) `xor` (table ! idx))+++-------------------------------------------------------------------------------+table :: V.Vector Word32+table = V.fromList+  [ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba+  , 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3+  , 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988+  , 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91+  , 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de+  , 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7+  , 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec+  , 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5+  , 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172+  , 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b+  , 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940+  , 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59+  , 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116+  , 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f+  , 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924+  , 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d+  , 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a+  , 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433+  , 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818+  , 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01+  , 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e+  , 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457+  , 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c+  , 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65+  , 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2+  , 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb+  , 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0+  , 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9+  , 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086+  , 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f+  , 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4+  , 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad+  , 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a+  , 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683+  , 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8+  , 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1+  , 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe+  , 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7+  , 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc+  , 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5+  , 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252+  , 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b+  , 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60+  , 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79+  , 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236+  , 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f+  , 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04+  , 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d+  , 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a+  , 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713+  , 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38+  , 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21+  , 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e+  , 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777+  , 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c+  , 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45+  , 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2+  , 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db+  , 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0+  , 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9+  , 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6+  , 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf+  , 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94+  , 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d+  ]
+ src/Data/Digest/CRC64.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE TypeFamilies #-}+module Data.Digest.CRC64+    ( CRC64(..)+    ) where+++--TODO: look to uuid for how they structure modules+--TODO: actually benchmark unboxed vector+-------------------------------------------------------------------------------+import           Data.Bits+import           Data.ByteString     as BS+import           Data.Vector.Unboxed as V+import           Data.Word+-------------------------------------------------------------------------------+import           Data.Digest.CRC+-------------------------------------------------------------------------------+++newtype CRC64 = CRC64 { crc64 :: Word64 } deriving (Show, Eq, Ord)+++instance CRC CRC64 where+  type CRCWord CRC64 = Word64+  initCRC = CRC64 0+  crcWord = crc64+  updateDigest = updateDigest64+  crcTable = table+++-------------------------------------------------------------------------------+updateDigest64 :: CRC64 -> ByteString -> CRC64+updateDigest64 crc = BS.foldl go crc+  where+    go (CRC64 crc') b8 =+      let idx = fromIntegral (crc' `xor` b64) .&. 0xff+          b64 = fromIntegral b8+      in CRC64 (((table ! idx) `xor` (crc' `shiftR` 8)) .&. 0xffffffffffffffff)+++-------------------------------------------------------------------------------+table :: V.Vector Word64+table = V.fromList+  [ 0x0000000000000000 , 0x01b0000000000000 , 0x0360000000000000 , 0x02d0000000000000+  , 0x06c0000000000000 , 0x0770000000000000 , 0x05a0000000000000 , 0x0410000000000000+  , 0x0d80000000000000 , 0x0c30000000000000 , 0x0ee0000000000000 , 0x0f50000000000000+  , 0x0b40000000000000 , 0x0af0000000000000 , 0x0820000000000000 , 0x0990000000000000+  , 0x1b00000000000000 , 0x1ab0000000000000 , 0x1860000000000000 , 0x19d0000000000000+  , 0x1dc0000000000000 , 0x1c70000000000000 , 0x1ea0000000000000 , 0x1f10000000000000+  , 0x1680000000000000 , 0x1730000000000000 , 0x15e0000000000000 , 0x1450000000000000+  , 0x1040000000000000 , 0x11f0000000000000 , 0x1320000000000000 , 0x1290000000000000+  , 0x3600000000000000 , 0x37b0000000000000 , 0x3560000000000000 , 0x34d0000000000000+  , 0x30c0000000000000 , 0x3170000000000000 , 0x33a0000000000000 , 0x3210000000000000+  , 0x3b80000000000000 , 0x3a30000000000000 , 0x38e0000000000000 , 0x3950000000000000+  , 0x3d40000000000000 , 0x3cf0000000000000 , 0x3e20000000000000 , 0x3f90000000000000+  , 0x2d00000000000000 , 0x2cb0000000000000 , 0x2e60000000000000 , 0x2fd0000000000000+  , 0x2bc0000000000000 , 0x2a70000000000000 , 0x28a0000000000000 , 0x2910000000000000+  , 0x2080000000000000 , 0x2130000000000000 , 0x23e0000000000000 , 0x2250000000000000+  , 0x2640000000000000 , 0x27f0000000000000 , 0x2520000000000000 , 0x2490000000000000+  , 0x6c00000000000000 , 0x6db0000000000000 , 0x6f60000000000000 , 0x6ed0000000000000+  , 0x6ac0000000000000 , 0x6b70000000000000 , 0x69a0000000000000 , 0x6810000000000000+  , 0x6180000000000000 , 0x6030000000000000 , 0x62e0000000000000 , 0x6350000000000000+  , 0x6740000000000000 , 0x66f0000000000000 , 0x6420000000000000 , 0x6590000000000000+  , 0x7700000000000000 , 0x76b0000000000000 , 0x7460000000000000 , 0x75d0000000000000+  , 0x71c0000000000000 , 0x7070000000000000 , 0x72a0000000000000 , 0x7310000000000000+  , 0x7a80000000000000 , 0x7b30000000000000 , 0x79e0000000000000 , 0x7850000000000000+  , 0x7c40000000000000 , 0x7df0000000000000 , 0x7f20000000000000 , 0x7e90000000000000+  , 0x5a00000000000000 , 0x5bb0000000000000 , 0x5960000000000000 , 0x58d0000000000000+  , 0x5cc0000000000000 , 0x5d70000000000000 , 0x5fa0000000000000 , 0x5e10000000000000+  , 0x5780000000000000 , 0x5630000000000000 , 0x54e0000000000000 , 0x5550000000000000+  , 0x5140000000000000 , 0x50f0000000000000 , 0x5220000000000000 , 0x5390000000000000+  , 0x4100000000000000 , 0x40b0000000000000 , 0x4260000000000000 , 0x43d0000000000000+  , 0x47c0000000000000 , 0x4670000000000000 , 0x44a0000000000000 , 0x4510000000000000+  , 0x4c80000000000000 , 0x4d30000000000000 , 0x4fe0000000000000 , 0x4e50000000000000+  , 0x4a40000000000000 , 0x4bf0000000000000 , 0x4920000000000000 , 0x4890000000000000+  , 0xd800000000000000 , 0xd9b0000000000000 , 0xdb60000000000000 , 0xdad0000000000000+  , 0xdec0000000000000 , 0xdf70000000000000 , 0xdda0000000000000 , 0xdc10000000000000+  , 0xd580000000000000 , 0xd430000000000000 , 0xd6e0000000000000 , 0xd750000000000000+  , 0xd340000000000000 , 0xd2f0000000000000 , 0xd020000000000000 , 0xd190000000000000+  , 0xc300000000000000 , 0xc2b0000000000000 , 0xc060000000000000 , 0xc1d0000000000000+  , 0xc5c0000000000000 , 0xc470000000000000 , 0xc6a0000000000000 , 0xc710000000000000+  , 0xce80000000000000 , 0xcf30000000000000 , 0xcde0000000000000 , 0xcc50000000000000+  , 0xc840000000000000 , 0xc9f0000000000000 , 0xcb20000000000000 , 0xca90000000000000+  , 0xee00000000000000 , 0xefb0000000000000 , 0xed60000000000000 , 0xecd0000000000000+  , 0xe8c0000000000000 , 0xe970000000000000 , 0xeba0000000000000 , 0xea10000000000000+  , 0xe380000000000000 , 0xe230000000000000 , 0xe0e0000000000000 , 0xe150000000000000+  , 0xe540000000000000 , 0xe4f0000000000000 , 0xe620000000000000 , 0xe790000000000000+  , 0xf500000000000000 , 0xf4b0000000000000 , 0xf660000000000000 , 0xf7d0000000000000+  , 0xf3c0000000000000 , 0xf270000000000000 , 0xf0a0000000000000 , 0xf110000000000000+  , 0xf880000000000000 , 0xf930000000000000 , 0xfbe0000000000000 , 0xfa50000000000000+  , 0xfe40000000000000 , 0xfff0000000000000 , 0xfd20000000000000 , 0xfc90000000000000+  , 0xb400000000000000 , 0xb5b0000000000000 , 0xb760000000000000 , 0xb6d0000000000000+  , 0xb2c0000000000000 , 0xb370000000000000 , 0xb1a0000000000000 , 0xb010000000000000+  , 0xb980000000000000 , 0xb830000000000000 , 0xbae0000000000000 , 0xbb50000000000000+  , 0xbf40000000000000 , 0xbef0000000000000 , 0xbc20000000000000 , 0xbd90000000000000+  , 0xaf00000000000000 , 0xaeb0000000000000 , 0xac60000000000000 , 0xadd0000000000000+  , 0xa9c0000000000000 , 0xa870000000000000 , 0xaaa0000000000000 , 0xab10000000000000+  , 0xa280000000000000 , 0xa330000000000000 , 0xa1e0000000000000 , 0xa050000000000000+  , 0xa440000000000000 , 0xa5f0000000000000 , 0xa720000000000000 , 0xa690000000000000+  , 0x8200000000000000 , 0x83b0000000000000 , 0x8160000000000000 , 0x80d0000000000000+  , 0x84c0000000000000 , 0x8570000000000000 , 0x87a0000000000000 , 0x8610000000000000+  , 0x8f80000000000000 , 0x8e30000000000000 , 0x8ce0000000000000 , 0x8d50000000000000+  , 0x8940000000000000 , 0x88f0000000000000 , 0x8a20000000000000 , 0x8b90000000000000+  , 0x9900000000000000 , 0x98b0000000000000 , 0x9a60000000000000 , 0x9bd0000000000000+  , 0x9fc0000000000000 , 0x9e70000000000000 , 0x9ca0000000000000 , 0x9d10000000000000+  , 0x9480000000000000 , 0x9530000000000000 , 0x97e0000000000000 , 0x9650000000000000+  , 0x9240000000000000 , 0x93f0000000000000 , 0x9120000000000000 , 0x9090000000000000+  ]
+ src/Data/Digest/CRC8.hs view
@@ -0,0 +1,104 @@+{-# LANGUAGE TypeFamilies #-}+module Data.Digest.CRC8+    ( CRC8(..)+    ) where+++-------------------------------------------------------------------------------+import           Data.Bits+import           Data.ByteString     as BS+import           Data.Vector.Unboxed as V+import           Data.Word+-------------------------------------------------------------------------------+import           Data.Digest.CRC+-------------------------------------------------------------------------------+++newtype CRC8 = CRC8 { crc8 :: Word8 } deriving (Show, Eq, Ord)+++instance CRC CRC8 where+  type CRCWord CRC8 = Word8+  initCRC = CRC8 0+  crcWord = crc8+  updateDigest = updateDigest8+  crcTable = table+++-------------------------------------------------------------------------------+updateDigest8 :: CRC8 -> ByteString -> CRC8+updateDigest8 crc = BS.foldl go crc+  where+    go (CRC8 crc') b8 =+      let idx = fromIntegral (crc' `xor` b8) .&. 0xff+      in CRC8 ((table ! idx) `xor` ((crc' `shiftR` 8) .&. 0xff))+++-------------------------------------------------------------------------------+table :: V.Vector Word8+table = V.fromList+  [ 0x00, 0x07, 0x0e, 0x09+  , 0x1c, 0x1b, 0x12, 0x15+  , 0x38, 0x3f, 0x36, 0x31+  , 0x24, 0x23, 0x2a, 0x2d+  , 0x70, 0x77, 0x7e, 0x79+  , 0x6c, 0x6b, 0x62, 0x65+  , 0x48, 0x4f, 0x46, 0x41+  , 0x54, 0x53, 0x5a, 0x5d+  , 0xe0, 0xe7, 0xee, 0xe9+  , 0xfc, 0xfb, 0xf2, 0xf5+  , 0xd8, 0xdf, 0xd6, 0xd1+  , 0xc4, 0xc3, 0xca, 0xcd+  , 0x90, 0x97, 0x9e, 0x99+  , 0x8c, 0x8b, 0x82, 0x85+  , 0xa8, 0xaf, 0xa6, 0xa1+  , 0xb4, 0xb3, 0xba, 0xbd+  , 0xc7, 0xc0, 0xc9, 0xce+  , 0xdb, 0xdc, 0xd5, 0xd2+  , 0xff, 0xf8, 0xf1, 0xf6+  , 0xe3, 0xe4, 0xed, 0xea+  , 0xb7, 0xb0, 0xb9, 0xbe+  , 0xab, 0xac, 0xa5, 0xa2+  , 0x8f, 0x88, 0x81, 0x86+  , 0x93, 0x94, 0x9d, 0x9a+  , 0x27, 0x20, 0x29, 0x2e+  , 0x3b, 0x3c, 0x35, 0x32+  , 0x1f, 0x18, 0x11, 0x16+  , 0x03, 0x04, 0x0d, 0x0a+  , 0x57, 0x50, 0x59, 0x5e+  , 0x4b, 0x4c, 0x45, 0x42+  , 0x6f, 0x68, 0x61, 0x66+  , 0x73, 0x74, 0x7d, 0x7a+  , 0x89, 0x8e, 0x87, 0x80+  , 0x95, 0x92, 0x9b, 0x9c+  , 0xb1, 0xb6, 0xbf, 0xb8+  , 0xad, 0xaa, 0xa3, 0xa4+  , 0xf9, 0xfe, 0xf7, 0xf0+  , 0xe5, 0xe2, 0xeb, 0xec+  , 0xc1, 0xc6, 0xcf, 0xc8+  , 0xdd, 0xda, 0xd3, 0xd4+  , 0x69, 0x6e, 0x67, 0x60+  , 0x75, 0x72, 0x7b, 0x7c+  , 0x51, 0x56, 0x5f, 0x58+  , 0x4d, 0x4a, 0x43, 0x44+  , 0x19, 0x1e, 0x17, 0x10+  , 0x05, 0x02, 0x0b, 0x0c+  , 0x21, 0x26, 0x2f, 0x28+  , 0x3d, 0x3a, 0x33, 0x34+  , 0x4e, 0x49, 0x40, 0x47+  , 0x52, 0x55, 0x5c, 0x5b+  , 0x76, 0x71, 0x78, 0x7f+  , 0x6a, 0x6d, 0x64, 0x63+  , 0x3e, 0x39, 0x30, 0x37+  , 0x22, 0x25, 0x2c, 0x2b+  , 0x06, 0x01, 0x08, 0x0f+  , 0x1a, 0x1d, 0x14, 0x13+  , 0xae, 0xa9, 0xa0, 0xa7+  , 0xb2, 0xb5, 0xbc, 0xbb+  , 0x96, 0x91, 0x98, 0x9f+  , 0x8a, 0x8d, 0x84, 0x83+  , 0xde, 0xd9, 0xd0, 0xd7+  , 0xc2, 0xc5, 0xcc, 0xcb+  , 0xe6, 0xe1, 0xe8, 0xef+  , 0xfa, 0xfd, 0xf4, 0xf3+  ]
+ test/Main.hs view
@@ -0,0 +1,88 @@+{-# LANGUAGE FlexibleContexts    #-}+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}+module Main+    ( main+    ) where+++-------------------------------------------------------------------------------+import           Control.Monad.Trans.Resource+import           Data.ByteString              (ByteString)+import           Data.ByteString.Builder+import           Data.ByteString.Lazy         (toStrict)+import           Data.Conduit+import           Data.Conduit.Binary          as CB+import           Data.Conduit.List            as CL+import           Data.Monoid+import           Data.Proxy+import           Data.Word+import           Test.Tasty+import           Test.Tasty.Golden+-------------------------------------------------------------------------------+import           Data.Digest.CRC+import           Data.Digest.CRC16+import           Data.Digest.CRC32+import           Data.Digest.CRC64+import           Data.Digest.CRC8+-------------------------------------------------------------------------------++++main :: IO ()+main = defaultMain testSuite+++-------------------------------------------------------------------------------+testSuite :: TestTree+testSuite = testGroup "crc"+  [ digestGolden "crc-64.golden" (Proxy :: Proxy CRC64)+  , digestGolden "crc-32.golden" (Proxy :: Proxy CRC32)+  , digestGolden "crc-16.golden" (Proxy :: Proxy CRC16)+  , digestGolden "crc-8.golden" (Proxy :: Proxy CRC8)+  ]+++-------------------------------------------------------------------------------+digestGolden :: forall a. (CRC a, HexBuilder (CRCWord a)) => FilePath -> Proxy a -> TestTree+digestGolden f _ = goldenVsString f goldenPath mkDigests+  where+    goldenPath = "test/data/" <> f+    mkDigests = runResourceT $+      sourceFile "test/data/inputs" =$=+        CB.lines =$=+        CL.map digest =$=+        CL.map (toHex :: a -> ByteString) =$=+        CL.map toHexLine $$+        sinkLbs+++-------------------------------------------------------------------------------+toHex :: (CRC a, HexBuilder (CRCWord a)) => a -> ByteString+toHex = toStrict . toLazyByteString . buildHex . crcWord+++-------------------------------------------------------------------------------+class HexBuilder a where+  buildHex :: a -> Builder+++instance HexBuilder Word64 where+  buildHex = word64Hex+++instance HexBuilder Word32 where+  buildHex = word32Hex+++instance HexBuilder Word16 where+  buildHex = word16Hex+++instance HexBuilder Word8 where+  buildHex = word8Hex+++-------------------------------------------------------------------------------+toHexLine :: ByteString -> ByteString+toHexLine b = "0x" <> b <> "\n"