nat-sized-numbers-0.3.0.0: Variable-sized numbers from type-level nats.

Safe HaskellNone
LanguageHaskell2010

Numeric.Sized.WordOfSize

Description

Arbitrary sized unsigned integers and related functions.

Synopsis

Documentation

newtype WordOfSize n Source #

An unsigned integer type with a size decided by a type-level nat. Numeric operations wraparound by default:

>>> (7 :: WordOfSize 3) + 1
0

The type wrapped is the smallest word type which can contain the desired word size. For instance, a WordOfSize 8 wraps a Word8, whereas a WordOfSize 9 wraps a Word16.

Truncation to the correct size is performed as little as possible while maintaining the correct semantics. This means that operations should be as fast as those on the underlying type.

Constructors

WordOfSize 

Instances

KnownSize n => Bounded (WordOfSize n) Source # 
KnownSize n => Enum (WordOfSize n) Source # 
KnownSize n => Eq (WordOfSize n) Source # 

Methods

(==) :: WordOfSize n -> WordOfSize n -> Bool #

(/=) :: WordOfSize n -> WordOfSize n -> Bool #

KnownSize n => Integral (WordOfSize n) Source # 
KnownSize n => Num (WordOfSize n) Source # 
KnownSize n => Ord (WordOfSize n) Source # 
KnownSize n => Read (WordOfSize n) Source # 
KnownSize n => Real (WordOfSize n) Source # 
KnownSize n => Show (WordOfSize n) Source # 
(KnownSize n, Ix (BoundingWord n)) => Ix (WordOfSize n) Source # 
NFData (BoundingWord n) => NFData (WordOfSize n) Source # 

Methods

rnf :: WordOfSize n -> () #

type family BoundingWord (n :: Nat) :: * where ... Source #

For a given size, the smallest type which encapsulates that size.

Equations

BoundingWord 0 = Word8 
BoundingWord 1 = Word8 
BoundingWord 2 = Word8 
BoundingWord 3 = Word8 
BoundingWord 4 = Word8 
BoundingWord 5 = Word8 
BoundingWord 6 = Word8 
BoundingWord 7 = Word8 
BoundingWord 8 = Word8 
BoundingWord 9 = Word16 
BoundingWord 10 = Word16 
BoundingWord 11 = Word16 
BoundingWord 12 = Word16 
BoundingWord 13 = Word16 
BoundingWord 14 = Word16 
BoundingWord 15 = Word16 
BoundingWord 16 = Word16 
BoundingWord 17 = Word32 
BoundingWord 18 = Word32 
BoundingWord 19 = Word32 
BoundingWord 20 = Word32 
BoundingWord 21 = Word32 
BoundingWord 22 = Word32 
BoundingWord 23 = Word32 
BoundingWord 24 = Word32 
BoundingWord 25 = Word32 
BoundingWord 26 = Word32 
BoundingWord 27 = Word32 
BoundingWord 28 = Word32 
BoundingWord 29 = Word32 
BoundingWord 30 = Word32 
BoundingWord 31 = Word32 
BoundingWord 32 = Word32 
BoundingWord 33 = Word64 
BoundingWord 34 = Word64 
BoundingWord 35 = Word64 
BoundingWord 36 = Word64 
BoundingWord 37 = Word64 
BoundingWord 38 = Word64 
BoundingWord 39 = Word64 
BoundingWord 40 = Word64 
BoundingWord 41 = Word64 
BoundingWord 42 = Word64 
BoundingWord 43 = Word64 
BoundingWord 44 = Word64 
BoundingWord 45 = Word64 
BoundingWord 46 = Word64 
BoundingWord 47 = Word64 
BoundingWord 48 = Word64 
BoundingWord 49 = Word64 
BoundingWord 50 = Word64 
BoundingWord 51 = Word64 
BoundingWord 52 = Word64 
BoundingWord 53 = Word64 
BoundingWord 54 = Word64 
BoundingWord 55 = Word64 
BoundingWord 56 = Word64 
BoundingWord 57 = Word64 
BoundingWord 58 = Word64 
BoundingWord 59 = Word64 
BoundingWord 60 = Word64 
BoundingWord 61 = Word64 
BoundingWord 62 = Word64 
BoundingWord 63 = Word64 
BoundingWord 64 = Word64 
BoundingWord n = Natural 

type KnownSize n = (KnownNat ((2 ^ n) - 1), Integral (BoundingWord n), Bits (BoundingWord n), KnownNat n, Show (BoundingWord n), Read (BoundingWord n)) Source #

In practice, every type-level `@Nat@` conforms to this constraint; it is needed here to provide static information.

allWordsOfSize :: KnownSize n => [WordOfSize n] Source #

Generates all words of a given size

>>> allWordsOfSize :: [WordOfSize 3]
[0,1,2,3,4,5,6,7]