Copyright | (c) Fumiaki Kinoshita 2018 |
---|---|

License | BSD3 |

Maintainer | Fumiaki Kinoshita <fumiexcel@gmail.com> |

Safe Haskell | Trustworthy |

Language | Haskell2010 |

## Synopsis

- data (s :: [k]) :& (h :: k -> Type)
- nil :: '[] :& h
- (<:) :: h x -> (xs :& h) -> (x ': xs) :& h
- (<!) :: h x -> (xs :& h) -> (x ': xs) :& h
- (=<:) :: Wrapper h => Repr h x -> (xs :& h) -> (x ': xs) :& h
- hlength :: (xs :& h) -> Int
- type family (xs :: [k]) ++ (ys :: [k]) :: [k] where ...
- happend :: (xs :& h) -> (ys :& h) -> (xs ++ ys) :& h
- hmap :: (forall x. g x -> h x) -> (xs :& g) -> xs :& h
- hmapWithIndex :: (forall x. Membership xs x -> g x -> h x) -> (xs :& g) -> xs :& h
- hzipWith :: (forall x. f x -> g x -> h x) -> (xs :& f) -> (xs :& g) -> xs :& h
- hzipWith3 :: (forall x. f x -> g x -> h x -> i x) -> (xs :& f) -> (xs :& g) -> (xs :& h) -> xs :& i
- hfoldMap :: Monoid a => (forall x. h x -> a) -> (xs :& h) -> a
- hfoldMapWithIndex :: Monoid a => (forall x. Membership xs x -> g x -> a) -> (xs :& g) -> a
- hfoldrWithIndex :: (forall x. Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r
- hfoldlWithIndex :: (forall x. Membership xs x -> r -> h x -> r) -> r -> (xs :& h) -> r
- htraverse :: Applicative f => (forall x. g x -> f (h x)) -> (xs :& g) -> f (xs :& h)
- htraverseWithIndex :: Applicative f => (forall x. Membership xs x -> g x -> f (h x)) -> (xs :& g) -> f (xs :& h)
- hsequence :: Applicative f => (xs :& Compose f h) -> f (xs :& h)
- hmapWithIndexFor :: Forall c xs => proxy c -> (forall x. c x => Membership xs x -> g x -> h x) -> (xs :& g) -> xs :& h
- hfoldMapFor :: (Forall c xs, Monoid a) => proxy c -> (forall x. c x => h x -> a) -> (xs :& h) -> a
- hfoldMapWithIndexFor :: (Forall c xs, Monoid a) => proxy c -> (forall x. c x => Membership xs x -> h x -> a) -> (xs :& h) -> a
- hfoldrWithIndexFor :: forall c xs h r proxy. Forall c xs => proxy c -> (forall x. c x => Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r
- hfoldlWithIndexFor :: Forall c xs => proxy c -> (forall x. c x => Membership xs x -> r -> h x -> r) -> r -> (xs :& h) -> r
- hfoldMapWith :: forall c xs h a. (Forall c xs, Monoid a) => (forall x. c x => h x -> a) -> (xs :& h) -> a
- hfoldMapWithIndexWith :: forall c xs h a. (Forall c xs, Monoid a) => (forall x. c x => Membership xs x -> h x -> a) -> (xs :& h) -> a
- hfoldrWithIndexWith :: forall c xs h r. Forall c xs => (forall x. c x => Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r
- hfoldlWithIndexWith :: forall c xs h r. Forall c xs => (forall x. c x => Membership xs x -> r -> h x -> r) -> r -> (xs :& h) -> r
- hmapWithIndexWith :: forall c xs g h. Forall c xs => (forall x. c x => Membership xs x -> g x -> h x) -> (xs :& g) -> xs :& h
- hforce :: (xs :& h) -> xs :& h
- haccumMap :: Foldable f => (a -> xs :/ g) -> (forall x. Membership xs x -> g x -> h x -> h x) -> (xs :& h) -> f a -> xs :& h
- haccum :: Foldable f => (forall x. Membership xs x -> g x -> h x -> h x) -> (xs :& h) -> f (xs :/ g) -> xs :& h
- hpartition :: (Foldable f, Generate xs) => (a -> xs :/ h) -> f a -> xs :& Compose [] h
- hlookup :: Membership xs x -> (xs :& h) -> h x
- hindex :: (xs :& h) -> Membership xs x -> h x
- class Generate (xs :: [k]) where
- henumerate :: (forall (x :: k). Membership xs x -> r -> r) -> r -> r
- hcount :: proxy xs -> Int
- hgenerateList :: Applicative f => (forall (x :: k). Membership xs x -> f (h x)) -> f (HList h xs)

- hgenerate :: (Generate xs, Applicative f) => (forall x. Membership xs x -> f (h x)) -> f (xs :& h)
- htabulate :: Generate xs => (forall x. Membership xs x -> h x) -> xs :& h
- hrepeat :: Generate xs => (forall x. h x) -> xs :& h
- hcollect :: (Functor f, Generate xs) => (a -> xs :& h) -> f a -> xs :& Compose f h
- hdistribute :: (Functor f, Generate xs) => f (xs :& h) -> xs :& Compose f h
- fromHList :: HList h xs -> xs :& h
- toHList :: forall h xs. (xs :& h) -> HList h xs
- class (ForallF c xs, Generate xs) => Forall (c :: k -> Constraint) (xs :: [k]) where
- henumerateFor :: proxy c -> proxy' xs -> (forall (x :: k). c x => Membership xs x -> r -> r) -> r -> r
- hgenerateListFor :: Applicative f => proxy c -> (forall (x :: k). c x => Membership xs x -> f (h x)) -> f (HList h xs)

- hgenerateFor :: (Forall c xs, Applicative f) => proxy c -> (forall x. c x => Membership xs x -> f (h x)) -> f (xs :& h)
- htabulateFor :: Forall c xs => proxy c -> (forall x. c x => Membership xs x -> h x) -> xs :& h
- hrepeatFor :: Forall c xs => proxy c -> (forall x. c x => h x) -> xs :& h
- hgenerateWith :: forall c xs f h. (Forall c xs, Applicative f) => (forall x. c x => Membership xs x -> f (h x)) -> f (xs :& h)
- htabulateWith :: forall c xs h. Forall c xs => (forall x. c x => Membership xs x -> h x) -> xs :& h
- hrepeatWith :: forall c xs h. Forall c xs => (forall x. c x => h x) -> xs :& h

# Basic operations

data (s :: [k]) :& (h :: k -> Type) Source #

The type of extensible products.

(:&) :: [k] -> (k -> Type) -> Type

#### Instances

(<:) :: h x -> (xs :& h) -> (x ': xs) :& h infixr 0 Source #

O(n) Prepend an element onto a product.
Expressions like `a <: b <: c <: nil`

are transformed to a single `fromHList`

.

type family (xs :: [k]) ++ (ys :: [k]) :: [k] where ... infixr 5 Source #

Concatenate type level lists

hmapWithIndex :: (forall x. Membership xs x -> g x -> h x) -> (xs :& g) -> xs :& h Source #

Map a function to every element of a product.

hzipWith :: (forall x. f x -> g x -> h x) -> (xs :& f) -> (xs :& g) -> xs :& h Source #

`zipWith`

for heterogeneous product

hzipWith3 :: (forall x. f x -> g x -> h x -> i x) -> (xs :& f) -> (xs :& g) -> (xs :& h) -> xs :& i Source #

`zipWith3`

for heterogeneous product

hfoldMapWithIndex :: Monoid a => (forall x. Membership xs x -> g x -> a) -> (xs :& g) -> a Source #

`hfoldMap`

with the membership of elements.

hfoldrWithIndex :: (forall x. Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r Source #

Right-associative fold of a product.

hfoldlWithIndex :: (forall x. Membership xs x -> r -> h x -> r) -> r -> (xs :& h) -> r Source #

Perform a strict left fold over the elements.

htraverse :: Applicative f => (forall x. g x -> f (h x)) -> (xs :& g) -> f (xs :& h) Source #

Traverse all elements and combine the result sequentially.
```
htraverse (fmap f . g) ≡ fmap (hmap f) . htraverse g
htraverse pure ≡ pure
htraverse (Compose . fmap g . f) ≡ Compose . fmap (htraverse g) . htraverse f
```

htraverseWithIndex :: Applicative f => (forall x. Membership xs x -> g x -> f (h x)) -> (xs :& g) -> f (xs :& h) Source #

`htraverse`

with `Membership`

s.

hsequence :: Applicative f => (xs :& Compose f h) -> f (xs :& h) Source #

`sequence`

analog for extensible products

# Constrained fold

hmapWithIndexFor :: Forall c xs => proxy c -> (forall x. c x => Membership xs x -> g x -> h x) -> (xs :& g) -> xs :& h Source #

Map a function to every element of a product.

hfoldMapFor :: (Forall c xs, Monoid a) => proxy c -> (forall x. c x => h x -> a) -> (xs :& h) -> a Source #

Constrained `hfoldMap`

hfoldMapWithIndexFor :: (Forall c xs, Monoid a) => proxy c -> (forall x. c x => Membership xs x -> h x -> a) -> (xs :& h) -> a Source #

`hfoldMapWithIndex`

with a constraint for each element.

hfoldrWithIndexFor :: forall c xs h r proxy. Forall c xs => proxy c -> (forall x. c x => Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r Source #

`hfoldrWithIndex`

with a constraint for each element.

hfoldlWithIndexFor :: Forall c xs => proxy c -> (forall x. c x => Membership xs x -> r -> h x -> r) -> r -> (xs :& h) -> r Source #

Constrained `hfoldlWithIndex`

# Constraind fold without proxies

hfoldMapWith :: forall c xs h a. (Forall c xs, Monoid a) => (forall x. c x => h x -> a) -> (xs :& h) -> a Source #

Constrained `hfoldMap`

hfoldMapWithIndexWith :: forall c xs h a. (Forall c xs, Monoid a) => (forall x. c x => Membership xs x -> h x -> a) -> (xs :& h) -> a Source #

`hfoldMapWithIndex`

with a constraint for each element.

hfoldrWithIndexWith :: forall c xs h r. Forall c xs => (forall x. c x => Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r Source #

hfoldlWithIndexWith :: forall c xs h r. Forall c xs => (forall x. c x => Membership xs x -> r -> h x -> r) -> r -> (xs :& h) -> r Source #

Constrained `hfoldlWithIndex`

hmapWithIndexWith :: forall c xs g h. Forall c xs => (forall x. c x => Membership xs x -> g x -> h x) -> (xs :& g) -> xs :& h Source #

# Evaluating

# Update

haccumMap :: Foldable f => (a -> xs :/ g) -> (forall x. Membership xs x -> g x -> h x -> h x) -> (xs :& h) -> f a -> xs :& h Source #

Accumulate sums on a product.

haccum :: Foldable f => (forall x. Membership xs x -> g x -> h x -> h x) -> (xs :& h) -> f (xs :/ g) -> xs :& h Source #

hpartition :: (Foldable f, Generate xs) => (a -> xs :/ h) -> f a -> xs :& Compose [] h Source #

Group sums by type.

# Lookup

hlookup :: Membership xs x -> (xs :& h) -> h x Source #

Get an element in a product.

# Generation

class Generate (xs :: [k]) where #

Every type-level list is an instance of `Generate`

.

henumerate :: (forall (x :: k). Membership xs x -> r -> r) -> r -> r #

Enumerate all possible `Membership`

s of `xs`

.

Count the number of memberships.

hgenerateList :: Applicative f => (forall (x :: k). Membership xs x -> f (h x)) -> f (HList h xs) #

Enumerate `Membership`

s and construct an `HList`

.

#### Instances

Generate ('[] :: [k]) | |

Defined in Type.Membership henumerate :: (forall (x :: k0). Membership '[] x -> r -> r) -> r -> r # hgenerateList :: Applicative f => (forall (x :: k0). Membership '[] x -> f (h x)) -> f (HList h '[]) # | |

Generate xs => Generate (x ': xs :: [k]) | |

Defined in Type.Membership henumerate :: (forall (x0 :: k0). Membership (x ': xs) x0 -> r -> r) -> r -> r # hcount :: proxy (x ': xs) -> Int # hgenerateList :: Applicative f => (forall (x0 :: k0). Membership (x ': xs) x0 -> f (h x0)) -> f (HList h (x ': xs)) # |

hgenerate :: (Generate xs, Applicative f) => (forall x. Membership xs x -> f (h x)) -> f (xs :& h) Source #

`Applicative`

version of `htabulate`

.

hrepeat :: Generate xs => (forall x. h x) -> xs :& h Source #

A product filled with the specified value.

hcollect :: (Functor f, Generate xs) => (a -> xs :& h) -> f a -> xs :& Compose f h Source #

The dual of `htraverse`

hdistribute :: (Functor f, Generate xs) => f (xs :& h) -> xs :& Compose f h Source #

The dual of `hsequence`

class (ForallF c xs, Generate xs) => Forall (c :: k -> Constraint) (xs :: [k]) where #

Every element in `xs`

satisfies `c`

henumerateFor :: proxy c -> proxy' xs -> (forall (x :: k). c x => Membership xs x -> r -> r) -> r -> r #

Enumerate all possible `Membership`

s of `xs`

with an additional context.

hgenerateListFor :: Applicative f => proxy c -> (forall (x :: k). c x => Membership xs x -> f (h x)) -> f (HList h xs) #

#### Instances

Forall (c :: k -> Constraint) ('[] :: [k]) | |

Defined in Type.Membership henumerateFor :: proxy c -> proxy' '[] -> (forall (x :: k0). c x => Membership '[] x -> r -> r) -> r -> r # hgenerateListFor :: Applicative f => proxy c -> (forall (x :: k0). c x => Membership '[] x -> f (h x)) -> f (HList h '[]) # | |

(c x, Forall c xs) => Forall (c :: a -> Constraint) (x ': xs :: [a]) | |

Defined in Type.Membership henumerateFor :: proxy c -> proxy' (x ': xs) -> (forall (x0 :: k). c x0 => Membership (x ': xs) x0 -> r -> r) -> r -> r # hgenerateListFor :: Applicative f => proxy c -> (forall (x0 :: k). c x0 => Membership (x ': xs) x0 -> f (h x0)) -> f (HList h (x ': xs)) # |

hgenerateFor :: (Forall c xs, Applicative f) => proxy c -> (forall x. c x => Membership xs x -> f (h x)) -> f (xs :& h) Source #

`Applicative`

version of `htabulateFor`

.

htabulateFor :: Forall c xs => proxy c -> (forall x. c x => Membership xs x -> h x) -> xs :& h Source #

Pure version of `hgenerateFor`

.

hrepeatFor :: Forall c xs => proxy c -> (forall x. c x => h x) -> xs :& h Source #

A product filled with the specified value.

hgenerateWith :: forall c xs f h. (Forall c xs, Applicative f) => (forall x. c x => Membership xs x -> f (h x)) -> f (xs :& h) Source #

`Applicative`

version of `htabulateFor`

.

htabulateWith :: forall c xs h. Forall c xs => (forall x. c x => Membership xs x -> h x) -> xs :& h Source #

Pure version of `hgenerateFor`

.

hrepeatWith :: forall c xs h. Forall c xs => (forall x. c x => h x) -> xs :& h Source #

A product filled with the specified value.