enumerate-0.2.2: enumerate all the values in a finite type (automatically)

Safe HaskellNone
LanguageHaskell2010

Enumerate.Cardinality

Description

the cardinality of a finite type, at the type-level.

Synopsis

Documentation

class Finite a Source #

a type is finite, i.e. has a bounded size.

laws:

e.g.

>>> reifyCardinality ([]::[Bool])
2

Associated Types

type Cardinality a :: Nat Source #

Instances

Finite Bool Source #
2

Associated Types

type Cardinality Bool :: Nat Source #

Finite Char Source #
1114112

Associated Types

type Cardinality Char :: Nat Source #

Finite Int8 Source #
2^8

Associated Types

type Cardinality Int8 :: Nat Source #

Finite Int16 Source #
2^16

Associated Types

type Cardinality Int16 :: Nat Source #

Finite Ordering Source #
3

Associated Types

type Cardinality Ordering :: Nat Source #

Finite Word8 Source #
2^8

Associated Types

type Cardinality Word8 :: Nat Source #

Finite Word16 Source #
2^16

Associated Types

type Cardinality Word16 :: Nat Source #

Finite () Source #
1

Associated Types

type Cardinality () :: Nat Source #

Finite Void Source #
0

Associated Types

type Cardinality Void :: Nat Source #

Finite a => Finite (Maybe a) Source #
1 + a

Associated Types

type Cardinality (Maybe a) :: Nat Source #

Finite a => Finite (Set a) Source #
2^a

Associated Types

type Cardinality (Set a) :: Nat Source #

(Finite a, Finite b) => Finite (a -> b) Source #
b^a

Associated Types

type Cardinality (a -> b) :: Nat Source #

(Finite a, Finite b) => Finite (Either a b) Source #
a + b

Associated Types

type Cardinality (Either a b) :: Nat Source #

(Finite a, Finite b) => Finite (a, b) Source #
a*b

Associated Types

type Cardinality (a, b) :: Nat Source #

Finite (Proxy * a) Source # 

Associated Types

type Cardinality (Proxy * a) :: Nat Source #

(Finite a, Finite b, Finite c) => Finite (a, b, c) Source #
a*b*c

Associated Types

type Cardinality (a, b, c) :: Nat Source #

Finite (Rec * f ([] *)) Source # 

Associated Types

type Cardinality (Rec * f ([] *)) :: Nat Source #

(Finite (f a), Finite (Rec * f as)) => Finite (Rec * f ((:) * a as)) Source #

the cardinality is a product of cardinalities.

Associated Types

type Cardinality (Rec * f ((:) * a as)) :: Nat Source #

(Finite a, Finite b, Finite c, Finite d) => Finite (a, b, c, d) Source #
a*b*c*d

Associated Types

type Cardinality (a, b, c, d) :: Nat Source #

(Finite a, Finite b, Finite c, Finite d, Finite e) => Finite (a, b, c, d, e) Source #
a*b*c*d*e

Associated Types

type Cardinality (a, b, c, d, e) :: Nat Source #

(Finite a, Finite b, Finite c, Finite d, Finite e, Finite f) => Finite (a, b, c, d, e, f) Source #
a*b*c*d*e*f

Associated Types

type Cardinality (a, b, c, d, e, f) :: Nat Source #

(Finite a, Finite b, Finite c, Finite d, Finite e, Finite f, Finite g) => Finite (a, b, c, d, e, f, g) Source #
a*b*c*d*e*f*g

Associated Types

type Cardinality (a, b, c, d, e, f, g) :: Nat Source #

type family GCardinality (f :: * -> *) :: Nat Source #

Instances

type GCardinality V1 Source # 
type GCardinality V1 = 0
type GCardinality U1 Source # 
type GCardinality U1 = 1
type GCardinality (K1 i a) Source # 
type GCardinality (K1 i a) = Cardinality a
type GCardinality ((:+:) f g) Source # 
type GCardinality ((:*:) f g) Source # 
type GCardinality (M1 i t f) Source # 
type GCardinality (M1 i t f) = GCardinality f

reifyCardinality :: forall a proxy. KnownNat (Cardinality a) => proxy a -> Natural Source #

>>> reifyCardinality ([]::[Bool])
2

type CardinalityWithin n a = IsCardinalityWithin n a ~ True Source #

typechecks only when the constraint is satisifed.

a constaint.

type IsCardinalityWithin n a = Cardinality a <=? n Source #

a predicate, inclusive.

> type CardinalityWithinAMillion a = CardinalityWithin 1000000 a
> :kind! CardinalityWithinAMillion Bool
True
> :kind! CardinalityWithinAMillion Char
False