{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module HaskellWorks.Data.Bits.Broadword.Word8
( h
, l
, kBitDiff
, kBitDiffPos
, kBitDiffUnsafe
) where
import Data.Word
import HaskellWorks.Data.Bits.BitWise
l :: Int -> Word8
l :: Int -> Word8
l Int
2 = Word8
0x55
l Int
4 = Word8
0x11
l Int
8 = Word8
0x01
l Int
k = [Char] -> Word8
forall a. HasCallStack => [Char] -> a
error ([Char]
"Invalid h k where k = " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
k)
{-# INLINE l #-}
h :: Int -> Word8
h :: Int -> Word8
h Int
2 = Word8
0xaa
h Int
4 = Word8
0x88
h Int
8 = Word8
0x80
h Int
k = [Char] -> Word8
forall a. HasCallStack => [Char] -> a
error ([Char]
"Invalid h k where k = " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
k)
{-# INLINE h #-}
kBitDiff :: Int -> Word8 -> Word8 -> Word8
kBitDiff :: Int -> Word8 -> Word8 -> Word8
kBitDiff Int
k Word8
x Word8
y = ((Word8
x Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.|. Int -> Word8
h Int
k) Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
- (Word8
y Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Word8 -> Word8
forall a. BitWise a => a -> a
comp (Int -> Word8
h Int
k))) Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.^. ((Word8
x Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.^. Word8 -> Word8
forall a. BitWise a => a -> a
comp Word8
y) Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Int -> Word8
h Int
k)
{-# INLINE kBitDiff #-}
kBitDiffPos :: Int -> Word8 -> Word8 -> Word8
kBitDiffPos :: Int -> Word8 -> Word8 -> Word8
kBitDiffPos Int
k Word8
x Word8
y =
let d :: Word8
d = Int -> Word8 -> Word8 -> Word8
kBitDiff Int
k Word8
x Word8
y in
let s :: Word8
s = Int -> Word8 -> Word8 -> Word8
kBitDiff Int
k Word8
0 ((Word8 -> Word8
forall a. BitWise a => a -> a
comp Word8
d Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Int -> Word8
h Int
k) Word8 -> Count -> Word8
forall a. Shift a => a -> Count -> a
.>. Int -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) in
let r :: Word8
r = Word8
d Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.&. Word8
s in
Word8
r
{-# INLINE kBitDiffPos #-}
kBitDiffUnsafe :: Int -> Word8 -> Word8 -> Word8
kBitDiffUnsafe :: Int -> Word8 -> Word8 -> Word8
kBitDiffUnsafe Int
k Word8
x Word8
y = ((Word8
x Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.|. Int -> Word8
h Int
k) Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
- Word8
y) Word8 -> Word8 -> Word8
forall a. BitWise a => a -> a -> a
.^. Int -> Word8
h Int
k
{-# INLINE kBitDiffUnsafe #-}