{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module HaskellWorks.Data.Bits.Word where
import Data.Word
import HaskellWorks.Data.Bits.BitLength
import HaskellWorks.Data.Bits.BitWise
class WordConcat a where
type DoubleWords a
leConcat :: a -> a -> DoubleWords a
class WordSplit a where
type HalfWords a
leSplit :: a -> (HalfWords a, HalfWords a)
instance WordConcat Word8 where
type DoubleWords Word8 = Word16
leConcat a b = (fromIntegral b .<. bitLength a) .|. fromIntegral a
instance WordConcat Word16 where
type DoubleWords Word16 = Word32
leConcat a b = (fromIntegral b .<. bitLength a) .|. fromIntegral a
instance WordConcat Word32 where
type DoubleWords Word32 = Word64
leConcat a b = (fromIntegral b .<. bitLength a) .|. fromIntegral a
instance WordSplit Word64 where
type HalfWords Word64 = Word32
leSplit a = (fromIntegral a, fromIntegral (a .>. 32))
instance WordSplit Word32 where
type HalfWords Word32 = Word16
leSplit a = (fromIntegral a, fromIntegral (a .>. 16))
instance WordSplit Word16 where
type HalfWords Word16 = Word8
leSplit a = (fromIntegral a, fromIntegral (a .>. 8))