module HaskellWorks.Data.Bits.LoBitsSized
  ( LoBitsSized(..)
  ) where

import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Positioning

class LoBitsSized a where
  -- | Value with the n least significant bits set to 1.
  loBitsSized :: Count -> a

instance LoBitsSized Word64 where
  loBitsSized :: Count -> Count
loBitsSized Count
n = let o :: Count
o = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count
64 Count -> Count -> Count
forall a. Num a => a -> a -> a
- Count
n) in Count
0xFFFFFFFFFFFFFFFF Count -> Count -> Count
forall a. Shift a => a -> Count -> a
.<. Count
o Count -> Count -> Count
forall a. Shift a => a -> Count -> a
.>. Count
o

instance LoBitsSized Word32 where
  loBitsSized :: Count -> Word32
loBitsSized Count
n = let o :: Count
o = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count
32 Count -> Count -> Count
forall a. Num a => a -> a -> a
- Count
n) in Word32
0xFFFFFFFF Word32 -> Count -> Word32
forall a. Shift a => a -> Count -> a
.<. Count
o Word32 -> Count -> Word32
forall a. Shift a => a -> Count -> a
.>. Count
o

instance LoBitsSized Word16 where
  loBitsSized :: Count -> Word16
loBitsSized Count
n = let o :: Count
o = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count
16 Count -> Count -> Count
forall a. Num a => a -> a -> a
- Count
n) in Word16
0xFFFF Word16 -> Count -> Word16
forall a. Shift a => a -> Count -> a
.<. Count
o Word16 -> Count -> Word16
forall a. Shift a => a -> Count -> a
.>. Count
o

instance LoBitsSized Word8 where
  loBitsSized :: Count -> Word8
loBitsSized Count
n = let o :: Count
o = Count -> Count
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count
8 Count -> Count -> Count
forall a. Num a => a -> a -> a
- Count
n) in Word8
0xFF Word8 -> Count -> Word8
forall a. Shift a => a -> Count -> a
.<. Count
o Word8 -> Count -> Word8
forall a. Shift a => a -> Count -> a
.>. Count
o