base-compat-0.14.1: A compatibility layer for base
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Bits.Compat

Synopsis

Documentation

module Data.Bits

bitDefault :: (Bits a, Num a) => Int -> a #

Default implementation for bit.

Note that: bitDefault i = 1 shiftL i

@since base-4.6.0.0

testBitDefault :: (Bits a, Num a) => a -> Int -> Bool #

Default implementation for testBit.

Note that: testBitDefault x i = (x .&. bit i) /= 0

@since base-4.6.0.0

popCountDefault :: (Bits a, Num a) => a -> Int #

Default implementation for popCount.

This implementation is intentionally naive. Instances are expected to provide an optimized implementation for their size.

@since base-4.6.0.0

(.^.) :: Bits a => a -> a -> a infixl 6 #

Infix version of xor.

@since base-4.17

(.>>.) :: Bits a => a -> Int -> a infixl 8 #

Infix version of shiftR.

@since base-4.17

(.<<.) :: Bits a => a -> Int -> a infixl 8 #

Infix version of shiftL.

@since base-4.17

(!>>.) :: Bits a => a -> Int -> a infixl 8 #

Infix version of unsafeShiftR.

@since base-4.17

(!<<.) :: Bits a => a -> Int -> a infixl 8 #

Infix version of unsafeShiftL.

@since base-4.17

toIntegralSized :: (Integral a, Integral b, Bits a, Bits b) => a -> Maybe b #

Attempt to convert an Integral type a to an Integral type b using the size of the types as measured by Bits methods.

A simpler version of this function is:

toIntegral :: (Integral a, Integral b) => a -> Maybe b
toIntegral x
  | toInteger x == toInteger y = Just y
  | otherwise                  = Nothing
  where
    y = fromIntegral x

This version requires going through Integer, which can be inefficient. However, toIntegralSized is optimized to allow GHC to statically determine the relative type sizes (as measured by bitSizeMaybe and isSigned) and avoid going through Integer for many types. (The implementation uses fromIntegral, which is itself optimized with rules for base types but may go through Integer for some type pairs.)

@since base-4.8.0.0

oneBits :: FiniteBits a => a #

A more concise version of complement zeroBits.

>>> complement (zeroBits :: Word) == (oneBits :: Word)
True
>>> complement (oneBits :: Word) == (zeroBits :: Word)
True

Note

The constraint on oneBits is arguably too strong. However, as some types (such as Natural) have undefined complement, this is the only safe choice.

@since base-4.16