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

Safe HaskellNone
LanguageHaskell2010

Numeric.Sized.IntOfSize

Description

This module exports integers with arbitrary sizes.

Synopsis

Documentation

newtype IntOfSize n Source #

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

>>> (3 :: IntOfSize 3) + 1
-4

The type wrapped is the smallest word type which can contain the desired word size. For instance, a IntOfSize 8 wraps a Int8, whereas a IntOfSize 9 wraps a Int16.

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

IntOfSize 

Instances

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

Methods

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

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

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

Methods

rnf :: IntOfSize n -> () #

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

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

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

The minimum size int type that will properly encapsulate an int of a given size.

Equations

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

allIntsOfSize :: KnownSize n => [IntOfSize n] Source #

Generate all values, in a sensible order

>>> allIntsOfSize :: [IntOfSize 4]
[0,-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8]