finite-table-0.1.0.1: Types isomorphic to Fin, and Tables indexed by them.
Safe HaskellNone
LanguageHaskell2010

Data.Finite

Description

Provides a class of types isomorphic to some statically-known Fin n.

This comes with Generics-based generated instances, and can be used to generate instances of Enum and Bounded (for which the stock deriving only supports sum types with no fields).

Since this is all still represented by Int internally, things will start raising errors if your type has more values than can fit in positive Ints. It's not recommended to use this on large types, and there's not much reason to want to anyway, as its main uses are to derive Enum (which is also based on Int) and to make the type compatible with Table (which would be impractically large for a key type with too many values to represent as Int).

The most common way to get a Finite instance for a type is to tack on a deriving Finite via Wrapped Generic MyType clause, which results in an automatically-generated instance based on the type's ADT structure.

This also provides instances Enum (Wrapped Finite a) and Bounded (Wrapped Finite a), so some types that would otherwise not be compatible with derived Enum instances can get them by adding a deriving (Enum, Bounded) via Wrapped Finite MyType clause.

Synopsis

Finite Enumerations

class Finite a where Source #

A typeclass of finite enumerable types.

These allow constructing Representable Functors using a simple Vec as the underlying storage, with constant-time lookup and efficient traversals.

Note that since Fin is (currently) represented by Int, any type with more values than Int can't have an instance. This means we can't have instances for 32- and 64-bit arithmetic types, since Int is only required to have 30 bits of precision.

Annoyingly, we also can't have an instance for Int and Word, because Fin wastes one bit of the Int by forbidding negative values. The cardinality of Int and Word would need to be twice as large as we can actually represent in a Fin. Another obstacle is that their cardinality varies between implementations and architectures; it's possible to work around this by making their Cardinality an irreducible type family application, and using 'Data.SInt.SI#' to plug in a value at runtime, but this makes the Fins related to Int and Word annoying to work with, since their bound is only known at runtime.

Fortunately, those instances are unlikely to be important, since a table of 2^32 elements is moderately impractical (32GiB of pointers alone), and a table of 2^64 elements is unrepresentable in current computer architectures.

toFin and fromFin shall be total functions and shall be the two sides of an isomorphism.

Associated Types

type Cardinality a :: Nat Source #

Methods

cardinality' :: SC a (Cardinality a) Source #

A witness that the cardinality is known at runtime.

This isn't part of the class context because we can only perform arithmetic on KnownNat instances in expression context; that is, we can't convince GHC that an instance with type Cardinality (Maybe a) = Cardinality a + 1 is valid if the KnownNat is in the class context. Instead, we use SInt to allow computing the cardinality at runtime.

toFin :: a -> Fin (Cardinality a) Source #

fromFin :: Fin (Cardinality a) -> a Source #

Instances

Instances details
Finite Bool Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Bool :: Nat Source #

Finite Char Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Char :: Nat Source #

Finite Int8 Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Int8 :: Nat Source #

Finite Int16 Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Int16 :: Nat Source #

Finite Ordering Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Ordering :: Nat Source #

Finite Word8 Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Word8 :: Nat Source #

Finite Word16 Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Word16 :: Nat Source #

Finite () Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality () :: Nat Source #

Methods

cardinality' :: SC () (Cardinality ()) Source #

toFin :: () -> Fin (Cardinality ()) Source #

fromFin :: Fin (Cardinality ()) -> () Source #

Finite Void Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality Void :: Nat Source #

Finite a => Finite (Maybe a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (Maybe a) :: Nat Source #

Finite a => Finite (Min a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (Min a) :: Nat Source #

Finite a => Finite (Max a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (Max a) :: Nat Source #

Finite a => Finite (First a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (First a) :: Nat Source #

Finite a => Finite (Last a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (Last a) :: Nat Source #

Finite a => Finite (WrappedMonoid a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (WrappedMonoid a) :: Nat Source #

Finite a => Finite (Identity a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (Identity a) :: Nat Source #

KnownNat n => Finite (Fin n) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (Fin n) :: Nat Source #

(Finite a, 1 <= Cardinality a) => Bounded (Wrapped Finite a) Source # 
Instance details

Defined in Data.Finite

Finite a => Enum (Wrapped Finite a) Source # 
Instance details

Defined in Data.Finite

(Finite a, Finite b) => Finite (Either a b) Source # 
Instance details

Defined in Data.Finite

Associated Types

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

(Finite a, Finite b) => Finite (a, b) Source # 
Instance details

Defined in Data.Finite

Associated Types

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

Methods

cardinality' :: SC (a, b) (Cardinality (a, b)) Source #

toFin :: (a, b) -> Fin (Cardinality (a, b)) Source #

fromFin :: Fin (Cardinality (a, b)) -> (a, b) Source #

(Generic a, GFinite (Rep a)) => Finite (Wrapped Generic a) Source # 
Instance details

Defined in Data.Finite

Associated Types

type Cardinality (Wrapped Generic a) :: Nat Source #

(Finite a, Finite b, Finite c) => Finite (a, b, c) Source # 
Instance details

Defined in Data.Finite

Associated Types

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

Methods

cardinality' :: SC (a, b, c) (Cardinality (a, b, c)) Source #

toFin :: (a, b, c) -> Fin (Cardinality (a, b, c)) Source #

fromFin :: Fin (Cardinality (a, b, c)) -> (a, b, c) Source #

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

Defined in Data.Finite

Associated Types

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

Methods

cardinality' :: SC (a, b, c, d) (Cardinality (a, b, c, d)) Source #

toFin :: (a, b, c, d) -> Fin (Cardinality (a, b, c, d)) Source #

fromFin :: Fin (Cardinality (a, b, c, d)) -> (a, b, c, d) Source #

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

Defined in Data.Finite

Associated Types

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

Methods

cardinality' :: SC (a, b, c, d, e) (Cardinality (a, b, c, d, e)) Source #

toFin :: (a, b, c, d, e) -> Fin (Cardinality (a, b, c, d, e)) Source #

fromFin :: Fin (Cardinality (a, b, c, d, e)) -> (a, b, c, d, e) Source #

cardinality :: forall a. Finite a => SInt (Cardinality a) Source #

A witness that the cardinality of a is known at runtime.

enumerate :: forall a. Finite a => [a] Source #

Generate a list containing every value of a.

asFin :: Finite a => Iso' a (Fin (Cardinality a)) Source #

An Iso between a and the corresponding Fin type.

Implementation Details

data SC a n Source #

A wrapper type around Cardinality a to support DerivingVia on GHC 8.6.

Instance methods that don't mention the instance head outside of type families / aliases don't work with DerivingVia on GHC 8.6 because it uses type signatures rather than TypeApplications to choose the instance to call into.

class GFinite a where Source #

The derived Finite implementation of a generic representation type.

Instances

Instances details
GFinite (U1 :: k -> Type) Source # 
Instance details

Defined in Data.Finite

Methods

gcardinality :: SInt (GCardinality U1) Source #

gtoFin :: forall (p :: k0). U1 p -> Fin (GCardinality U1) Source #

gfromFin :: forall (p :: k0). Fin (GCardinality U1) -> U1 p Source #

GFinite (V1 :: k -> Type) Source # 
Instance details

Defined in Data.Finite

Methods

gcardinality :: SInt (GCardinality V1) Source #

gtoFin :: forall (p :: k0). V1 p -> Fin (GCardinality V1) Source #

gfromFin :: forall (p :: k0). Fin (GCardinality V1) -> V1 p Source #

(GFinite f, GFinite g) => GFinite (f :*: g :: k -> Type) Source # 
Instance details

Defined in Data.Finite

Methods

gcardinality :: SInt (GCardinality (f :*: g)) Source #

gtoFin :: forall (p :: k0). (f :*: g) p -> Fin (GCardinality (f :*: g)) Source #

gfromFin :: forall (p :: k0). Fin (GCardinality (f :*: g)) -> (f :*: g) p Source #

(GFinite f, GFinite g) => GFinite (f :+: g :: k -> Type) Source # 
Instance details

Defined in Data.Finite

Methods

gcardinality :: SInt (GCardinality (f :+: g)) Source #

gtoFin :: forall (p :: k0). (f :+: g) p -> Fin (GCardinality (f :+: g)) Source #

gfromFin :: forall (p :: k0). Fin (GCardinality (f :+: g)) -> (f :+: g) p Source #

Finite a => GFinite (K1 i a :: k -> Type) Source # 
Instance details

Defined in Data.Finite

Methods

gcardinality :: SInt (GCardinality (K1 i a)) Source #

gtoFin :: forall (p :: k0). K1 i a p -> Fin (GCardinality (K1 i a)) Source #

gfromFin :: forall (p :: k0). Fin (GCardinality (K1 i a)) -> K1 i a p Source #

GFinite f => GFinite (M1 i c f :: k -> Type) Source # 
Instance details

Defined in Data.Finite

Methods

gcardinality :: SInt (GCardinality (M1 i c f)) Source #

gtoFin :: forall (p :: k0). M1 i c f p -> Fin (GCardinality (M1 i c f)) Source #

gfromFin :: forall (p :: k0). Fin (GCardinality (M1 i c f)) -> M1 i c f p Source #

type family GCardinality a where ... Source #

The derived cardinality of a generic representation type.