OddWord-1.0.2.0: Provides a wrapper for deriving word types with fewer bits.

Safe HaskellSafe
LanguageHaskell2010

Data.Word.Odd

Contents

Synopsis

Odd Word Wrapper

data OddWord a n Source #

OddWord provides a range of unsigned integer word types with a length in bits encoded at the type level. The first type parameter a must supply an integer type which can hold at least as many bits as required for the OddWord. The second type paramter n then encodes the length in bits which the OddWord will be restricted to.

The length of the OddWord can be encoded as a string of binary digits using the One, Zero, and () type constructors. The outermost constructor specifies the most significant digit and each subsequent digit is nested inside the previous type constructor via its type parameter. Hence, the encoding is terminated by the () type constructor. For example, the number 4 would be expressed as: One (Zero (Zero ())).

Alternatively, if the compiler supports type-level naturals then these can be used via the Lit type constructor. For example, the number 4 can be expressed as: Lit 4.

To supply a complete example, a 4-bit integer type could be built from a Word8 and specified as either OddWord Word8 (One (Zero (Zero ()))) or OddWord Word8 (Lit 4).

The behaviour of an OddWord is undefined if the specified length is greater than that of the underlying integer type. The behaviour is also undefined if the specified length is equal to that of the underlying integer type and that type is also signed.

Instances

(Num a, Bits a, TypeNum n) => Bounded (OddWord a n) Source # 

Methods

minBound :: OddWord a n #

maxBound :: OddWord a n #

(Enum a, Ord a, Num a, Bits a, TypeNum n) => Enum (OddWord a n) Source # 

Methods

succ :: OddWord a n -> OddWord a n #

pred :: OddWord a n -> OddWord a n #

toEnum :: Int -> OddWord a n #

fromEnum :: OddWord a n -> Int #

enumFrom :: OddWord a n -> [OddWord a n] #

enumFromThen :: OddWord a n -> OddWord a n -> [OddWord a n] #

enumFromTo :: OddWord a n -> OddWord a n -> [OddWord a n] #

enumFromThenTo :: OddWord a n -> OddWord a n -> OddWord a n -> [OddWord a n] #

Eq a => Eq (OddWord a n) Source # 

Methods

(==) :: OddWord a n -> OddWord a n -> Bool #

(/=) :: OddWord a n -> OddWord a n -> Bool #

(Integral a, Bits a, TypeNum n) => Integral (OddWord a n) Source # 

Methods

quot :: OddWord a n -> OddWord a n -> OddWord a n #

rem :: OddWord a n -> OddWord a n -> OddWord a n #

div :: OddWord a n -> OddWord a n -> OddWord a n #

mod :: OddWord a n -> OddWord a n -> OddWord a n #

quotRem :: OddWord a n -> OddWord a n -> (OddWord a n, OddWord a n) #

divMod :: OddWord a n -> OddWord a n -> (OddWord a n, OddWord a n) #

toInteger :: OddWord a n -> Integer #

(Num a, Bits a, TypeNum n) => Num (OddWord a n) Source # 

Methods

(+) :: OddWord a n -> OddWord a n -> OddWord a n #

(-) :: OddWord a n -> OddWord a n -> OddWord a n #

(*) :: OddWord a n -> OddWord a n -> OddWord a n #

negate :: OddWord a n -> OddWord a n #

abs :: OddWord a n -> OddWord a n #

signum :: OddWord a n -> OddWord a n #

fromInteger :: Integer -> OddWord a n #

Ord a => Ord (OddWord a n) Source # 

Methods

compare :: OddWord a n -> OddWord a n -> Ordering #

(<) :: OddWord a n -> OddWord a n -> Bool #

(<=) :: OddWord a n -> OddWord a n -> Bool #

(>) :: OddWord a n -> OddWord a n -> Bool #

(>=) :: OddWord a n -> OddWord a n -> Bool #

max :: OddWord a n -> OddWord a n -> OddWord a n #

min :: OddWord a n -> OddWord a n -> OddWord a n #

(Read a, Num a, Bits a, TypeNum n) => Read (OddWord a n) Source # 
(Real a, Bits a, TypeNum n) => Real (OddWord a n) Source # 

Methods

toRational :: OddWord a n -> Rational #

Show a => Show (OddWord a n) Source # 

Methods

showsPrec :: Int -> OddWord a n -> ShowS #

show :: OddWord a n -> String #

showList :: [OddWord a n] -> ShowS #

(Num a, Bits a, TypeNum n) => Bits (OddWord a n) Source # 

Methods

(.&.) :: OddWord a n -> OddWord a n -> OddWord a n #

(.|.) :: OddWord a n -> OddWord a n -> OddWord a n #

xor :: OddWord a n -> OddWord a n -> OddWord a n #

complement :: OddWord a n -> OddWord a n #

shift :: OddWord a n -> Int -> OddWord a n #

rotate :: OddWord a n -> Int -> OddWord a n #

zeroBits :: OddWord a n #

bit :: Int -> OddWord a n #

setBit :: OddWord a n -> Int -> OddWord a n #

clearBit :: OddWord a n -> Int -> OddWord a n #

complementBit :: OddWord a n -> Int -> OddWord a n #

testBit :: OddWord a n -> Int -> Bool #

bitSizeMaybe :: OddWord a n -> Maybe Int #

bitSize :: OddWord a n -> Int #

isSigned :: OddWord a n -> Bool #

shiftL :: OddWord a n -> Int -> OddWord a n #

unsafeShiftL :: OddWord a n -> Int -> OddWord a n #

shiftR :: OddWord a n -> Int -> OddWord a n #

unsafeShiftR :: OddWord a n -> Int -> OddWord a n #

rotateL :: OddWord a n -> Int -> OddWord a n #

rotateR :: OddWord a n -> Int -> OddWord a n #

popCount :: OddWord a n -> Int #

(Num a, FiniteBitsBase a, TypeNum n) => FiniteBits (OddWord a n) Source # 

Type Numbers

class TypeNum a Source #

Intances of TypeNum represent type-level numbers.

Minimal complete definition

typeNum

Instances

TypeNum () Source # 

Methods

typeNum :: TypeNumBuilder ()

ZNatValue (ToZNat n) => TypeNum (Lit n) Source # 

Methods

typeNum :: TypeNumBuilder (Lit n)

TypeNum a => TypeNum (Zero a) Source # 

Methods

typeNum :: TypeNumBuilder (Zero a)

TypeNum a => TypeNum (One a) Source # 

Methods

typeNum :: TypeNumBuilder (One a)

data One a Source #

Represents a type-level number with a leading one bit followed by the string of digits specified by a.

Instances

TypeNum a => TypeNum (One a) Source # 

Methods

typeNum :: TypeNumBuilder (One a)

data Zero a Source #

Represents a type-level number with a placeholder zero bit followed by the string of digits specified by a.

Instances

TypeNum a => TypeNum (Zero a) Source # 

Methods

typeNum :: TypeNumBuilder (Zero a)

data Lit :: Nat -> * Source #

Converts a native GHC type-level natural into one usable by this library. This requires the DataKinds extension.

Instances

ZNatValue (ToZNat n) => TypeNum (Lit n) Source # 

Methods

typeNum :: TypeNumBuilder (Lit n)

Finite Bits

class Bits a => FiniteBitsBase a where Source #

Required to implement FiniteBits for an OddWord based on type a.

Methods

subWordClz :: Int -> a -> Int Source #

Count the leading zeros on a w-bit wide word.

subWordCtz :: Int -> a -> Int Source #

Count the trailing zeros on a w-bit wide word.

Predefined Odd Words

type Word3 = OddWord Word8 (One (One ())) Source #

type Word5 = OddWord Word8 (One (Zero (One ()))) Source #

type Word6 = OddWord Word8 (One (One (Zero ()))) Source #

type Word7 = OddWord Word8 (One (One (One ()))) Source #

type Word9 = OddWord Word16 (One (Zero (Zero (One ())))) Source #

type Word11 = OddWord Word16 (One (Zero (One (One ())))) Source #

type Word13 = OddWord Word16 (One (One (Zero (One ())))) Source #

type Word14 = OddWord Word16 (One (One (One (Zero ())))) Source #

type Word15 = OddWord Word16 (One (One (One (One ())))) Source #

type Word19 = OddWord Word32 (One (Zero (Zero (One (One ()))))) Source #

type Word21 = OddWord Word32 (One (Zero (One (Zero (One ()))))) Source #

type Word22 = OddWord Word32 (One (Zero (One (One (Zero ()))))) Source #

type Word23 = OddWord Word32 (One (Zero (One (One (One ()))))) Source #

type Word25 = OddWord Word32 (One (One (Zero (Zero (One ()))))) Source #

type Word26 = OddWord Word32 (One (One (Zero (One (Zero ()))))) Source #

type Word27 = OddWord Word32 (One (One (Zero (One (One ()))))) Source #

type Word28 = OddWord Word32 (One (One (One (Zero (Zero ()))))) Source #

type Word29 = OddWord Word32 (One (One (One (Zero (One ()))))) Source #

type Word30 = OddWord Word32 (One (One (One (One (Zero ()))))) Source #

type Word31 = OddWord Word32 (One (One (One (One (One ()))))) Source #

type Word33 = OddWord Word64 (One (Zero (Zero (Zero (Zero (One ())))))) Source #

type Word34 = OddWord Word64 (One (Zero (Zero (Zero (One (Zero ())))))) Source #

type Word35 = OddWord Word64 (One (Zero (Zero (Zero (One (One ())))))) Source #

type Word36 = OddWord Word64 (One (Zero (Zero (One (Zero (Zero ())))))) Source #

type Word37 = OddWord Word64 (One (Zero (Zero (One (Zero (One ())))))) Source #

type Word38 = OddWord Word64 (One (Zero (Zero (One (One (Zero ())))))) Source #

type Word39 = OddWord Word64 (One (Zero (Zero (One (One (One ())))))) Source #

type Word40 = OddWord Word64 (One (Zero (One (Zero (Zero (Zero ())))))) Source #

type Word41 = OddWord Word64 (One (Zero (One (Zero (Zero (One ())))))) Source #

type Word42 = OddWord Word64 (One (Zero (One (Zero (One (Zero ())))))) Source #

type Word43 = OddWord Word64 (One (Zero (One (Zero (One (One ())))))) Source #

type Word44 = OddWord Word64 (One (Zero (One (One (Zero (Zero ())))))) Source #

type Word45 = OddWord Word64 (One (Zero (One (One (Zero (One ())))))) Source #

type Word46 = OddWord Word64 (One (Zero (One (One (One (Zero ())))))) Source #

type Word47 = OddWord Word64 (One (Zero (One (One (One (One ())))))) Source #

type Word48 = OddWord Word64 (One (One (Zero (Zero (Zero (Zero ())))))) Source #

type Word49 = OddWord Word64 (One (One (Zero (Zero (Zero (One ())))))) Source #

type Word50 = OddWord Word64 (One (One (Zero (Zero (One (Zero ())))))) Source #

type Word51 = OddWord Word64 (One (One (Zero (Zero (One (One ())))))) Source #

type Word52 = OddWord Word64 (One (One (Zero (One (Zero (Zero ())))))) Source #

type Word53 = OddWord Word64 (One (One (Zero (One (Zero (One ())))))) Source #

type Word54 = OddWord Word64 (One (One (Zero (One (One (Zero ())))))) Source #

type Word55 = OddWord Word64 (One (One (Zero (One (One (One ())))))) Source #

type Word56 = OddWord Word64 (One (One (One (Zero (Zero (Zero ())))))) Source #

type Word57 = OddWord Word64 (One (One (One (Zero (Zero (One ())))))) Source #

type Word58 = OddWord Word64 (One (One (One (Zero (One (Zero ())))))) Source #

type Word59 = OddWord Word64 (One (One (One (Zero (One (One ())))))) Source #

type Word60 = OddWord Word64 (One (One (One (One (Zero (Zero ())))))) Source #

type Word61 = OddWord Word64 (One (One (One (One (Zero (One ())))))) Source #

type Word62 = OddWord Word64 (One (One (One (One (One (Zero ())))))) Source #

type Word63 = OddWord Word64 (One (One (One (One (One (One ())))))) Source #