fixed-vector-hetero-0.3.1.2: Generic heterogeneous vectors

Safe HaskellNone
LanguageHaskell98

Data.Vector.HFixed.Class

Contents

Synopsis

Types and type classes

Peano numbers

data S n :: * -> * #

Successor of n

Instances

Arity n => Index Z (S n) 

Methods

getF :: Z -> Fun (S n) a a #

putF :: Z -> a -> Fun (S n) a r -> Fun (S n) a r #

lensF :: Functor f => Z -> (a -> f a) -> Fun (S n) a r -> Fun (S n) a (f r) #

Arity n => Arity (S n) 

Methods

accum :: (forall k. t (S k) -> a -> t k) -> (t Z -> b) -> t (S n) -> Fun (S n) a b #

applyFun :: (forall k. t (S k) -> (a, t k)) -> t (S n) -> Fn (S n) a b -> (b, t Z) #

applyFunM :: Monad m => (forall k. t (S k) -> m (a, t k)) -> t (S n) -> m (ContVec (S n) a, t Z) #

arity :: S n -> Int #

reverseF :: Fun (S n) a b -> Fun (S n) a b #

uncurryMany :: Fun (Add (S n) k) a b -> Fun (S n) a (Fun k a b) #

gunfoldF :: Data a => (forall b x. Data b => c (b -> x) -> c x) -> T_gunfold c r a (S n) -> c r #

(NatIso k ((-) n 1), (~) * (ToPeano ((-) n 1)) k, (~) * (ToPeano n) (S k), (~) Nat n ((+) 1 ((-) n 1))) => NatIso (S k) n 
HomArity n a => HomArity (S n) a Source # 

Methods

toHeterogeneous :: Fun (S n) a r -> Fun (HomList * (S n) a) r Source #

toHomogeneous :: Fun (HomList * (S n) a) r -> Fun (S n) a r Source #

Index k n => Index (S k) (S n) 

Methods

getF :: S k -> Fun (S n) a a #

putF :: S k -> a -> Fun (S n) a r -> Fun (S n) a r #

lensF :: Functor f => S k -> (a -> f a) -> Fun (S n) a r -> Fun (S n) a (f r) #

Index n xs => Index (S n) ((:) * x xs) Source # 

Associated Types

type ValueAt (S n) ((:) * x xs :: [*]) :: * Source #

type NewElems (S n) ((:) * x xs :: [*]) a :: [*] Source #

Methods

getF :: S n -> Fun ((* ': x) xs) (ValueAt (S n) ((* ': x) xs)) Source #

putF :: S n -> ValueAt (S n) ((* ': x) xs) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) r Source #

lensF :: (Functor f, (* ~ v) (ValueAt (S n) ((* ': x) xs))) => S n -> (v -> f v) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) (f r) Source #

lensChF :: Functor f => S n -> (ValueAt (S n) ((* ': x) xs) -> f a) -> Fun (NewElems (S n) ((* ': x) xs) a) r -> Fun ((* ': x) xs) (f r) Source #

witWrapIndex :: WitWrapIndex f (S n) ((* ': x) xs) Source #

type HomList α (S n) a Source # 
type HomList α (S n) a = (:) α a (HomList α n a)
type Add (S n) k 
type Add (S n) k = S (Add n k)
type Fn (S n) a b 
type Fn (S n) a b = a -> Fn n a b
type ValueAt (S n) ((:) * x xs) Source # 
type ValueAt (S n) ((:) * x xs) = ValueAt n xs
type NewElems (S n) ((:) * x xs) a Source # 
type NewElems (S n) ((:) * x xs) a = (:) * x (NewElems n xs a)

data Z :: * #

Type level zero

Instances

Arity Z 

Methods

accum :: (forall k. t (S k) -> a -> t k) -> (t Z -> b) -> t Z -> Fun Z a b #

applyFun :: (forall k. t (S k) -> (a, t k)) -> t Z -> Fn Z a b -> (b, t Z) #

applyFunM :: Monad m => (forall k. t (S k) -> m (a, t k)) -> t Z -> m (ContVec Z a, t Z) #

arity :: Z -> Int #

reverseF :: Fun Z a b -> Fun Z a b #

uncurryMany :: Fun (Add Z k) a b -> Fun Z a (Fun k a b) #

gunfoldF :: Data a => (forall b x. Data b => c (b -> x) -> c x) -> T_gunfold c r a Z -> c r #

NatIso Z 0 
HomArity Z a Source # 

Methods

toHeterogeneous :: Fun Z a r -> Fun (HomList * Z a) r Source #

toHomogeneous :: Fun (HomList * Z a) r -> Fun Z a r Source #

Arity n => Index Z (S n) 

Methods

getF :: Z -> Fun (S n) a a #

putF :: Z -> a -> Fun (S n) a r -> Fun (S n) a r #

lensF :: Functor f => Z -> (a -> f a) -> Fun (S n) a r -> Fun (S n) a (f r) #

Arity xs => Index Z ((:) * x xs) Source # 

Associated Types

type ValueAt Z ((:) * x xs :: [*]) :: * Source #

type NewElems Z ((:) * x xs :: [*]) a :: [*] Source #

Methods

getF :: Z -> Fun ((* ': x) xs) (ValueAt Z ((* ': x) xs)) Source #

putF :: Z -> ValueAt Z ((* ': x) xs) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) r Source #

lensF :: (Functor f, (* ~ v) (ValueAt Z ((* ': x) xs))) => Z -> (v -> f v) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) (f r) Source #

lensChF :: Functor f => Z -> (ValueAt Z ((* ': x) xs) -> f a) -> Fun (NewElems Z ((* ': x) xs) a) r -> Fun ((* ': x) xs) (f r) Source #

witWrapIndex :: WitWrapIndex f Z ((* ': x) xs) Source #

type Add Z n 
type Add Z n = n
type Fn Z a b 
type Fn Z a b = b
type HomList α Z a Source # 
type HomList α Z a = [] α
type ValueAt Z ((:) * x xs) Source # 
type ValueAt Z ((:) * x xs) = x
type NewElems Z ((:) * x xs) a Source # 
type NewElems Z ((:) * x xs) a = (:) * a xs

Isomorphism between Peano numbers and Nats

class ((~) Nat (ToNat a) b, (~) * (ToPeano b) a) => NatIso a b #

Isomorphism between two representations of natural numbers

Instances

NatIso Z 0 
(NatIso k ((-) n 1), (~) * (ToPeano ((-) n 1)) k, (~) * (ToPeano n) (S k), (~) Nat n ((+) 1 ((-) n 1))) => NatIso (S k) n 

type family ToPeano (b :: Nat) :: * where ... #

Convert Nat number to Peano represenation

Equations

ToPeano 0 = Z 
ToPeano n = S (ToPeano ((-) n 1)) 

type family ToNat a :: Nat where ... #

Convert Peano number to Nat

Equations

ToNat Z = 0 
ToNat (S k) = (+) 1 (ToNat k) 

N-ary functions

type family Fn (as :: [*]) b Source #

Type family for N-ary function. Types of function parameters are encoded as the list of types.

Instances

type Fn ([] *) b Source # 
type Fn ([] *) b = b
type Fn ((:) * a as) b Source # 
type Fn ((:) * a as) b = a -> Fn as b

newtype Fun as b Source #

Newtype wrapper to work around of type families' lack of injectivity.

Constructors

Fun 

Fields

Instances

Arity xs => Monad (Fun xs) Source # 

Methods

(>>=) :: Fun xs a -> (a -> Fun xs b) -> Fun xs b #

(>>) :: Fun xs a -> Fun xs b -> Fun xs b #

return :: a -> Fun xs a #

fail :: String -> Fun xs a #

Arity xs => Functor (Fun xs) Source # 

Methods

fmap :: (a -> b) -> Fun xs a -> Fun xs b #

(<$) :: a -> Fun xs b -> Fun xs a #

Arity xs => Applicative (Fun xs) Source # 

Methods

pure :: a -> Fun xs a #

(<*>) :: Fun xs (a -> b) -> Fun xs a -> Fun xs b #

(*>) :: Fun xs a -> Fun xs b -> Fun xs b #

(<*) :: Fun xs a -> Fun xs b -> Fun xs a #

newtype TFun f as b Source #

Newtype wrapper for function where all type parameters have same type constructor. This type is required for writing function which works with monads, appicatives etc.

Constructors

TFun 

Fields

Instances

Arity xs => Monad (TFun * f xs) Source # 

Methods

(>>=) :: TFun * f xs a -> (a -> TFun * f xs b) -> TFun * f xs b #

(>>) :: TFun * f xs a -> TFun * f xs b -> TFun * f xs b #

return :: a -> TFun * f xs a #

fail :: String -> TFun * f xs a #

Arity xs => Functor (TFun * f xs) Source # 

Methods

fmap :: (a -> b) -> TFun * f xs a -> TFun * f xs b #

(<$) :: a -> TFun * f xs b -> TFun * f xs a #

Arity xs => Applicative (TFun * f xs) Source # 

Methods

pure :: a -> TFun * f xs a #

(<*>) :: TFun * f xs (a -> b) -> TFun * f xs a -> TFun * f xs b #

(*>) :: TFun * f xs a -> TFun * f xs b -> TFun * f xs b #

(<*) :: TFun * f xs a -> TFun * f xs b -> TFun * f xs a #

funToTFun :: Fun (Wrap f xs) b -> TFun f xs b Source #

Cast Fun to equivalent TFun

tfunToFun :: TFun f xs b -> Fun (Wrap f xs) b Source #

Cast TFun to equivalent Fun

Type functions

data Proxy k t :: forall k. k -> * #

A concrete, poly-kinded proxy type

Constructors

Proxy 

Instances

Monad (Proxy *) 

Methods

(>>=) :: Proxy * a -> (a -> Proxy * b) -> Proxy * b #

(>>) :: Proxy * a -> Proxy * b -> Proxy * b #

return :: a -> Proxy * a #

fail :: String -> Proxy * a #

Functor (Proxy *) 

Methods

fmap :: (a -> b) -> Proxy * a -> Proxy * b #

(<$) :: a -> Proxy * b -> Proxy * a #

Applicative (Proxy *) 

Methods

pure :: a -> Proxy * a #

(<*>) :: Proxy * (a -> b) -> Proxy * a -> Proxy * b #

(*>) :: Proxy * a -> Proxy * b -> Proxy * b #

(<*) :: Proxy * a -> Proxy * b -> Proxy * a #

Generic1 (Proxy *) 

Associated Types

type Rep1 (Proxy * :: * -> *) :: * -> * #

Methods

from1 :: Proxy * a -> Rep1 (Proxy *) a #

to1 :: Rep1 (Proxy *) a -> Proxy * a #

Alternative (Proxy *) 

Methods

empty :: Proxy * a #

(<|>) :: Proxy * a -> Proxy * a -> Proxy * a #

some :: Proxy * a -> Proxy * [a] #

many :: Proxy * a -> Proxy * [a] #

MonadPlus (Proxy *) 

Methods

mzero :: Proxy * a #

mplus :: Proxy * a -> Proxy * a -> Proxy * a #

Vector (Proxy *) a 

Methods

construct :: Fun (Dim (Proxy *)) a (Proxy * a) #

inspect :: Proxy * a -> Fun (Dim (Proxy *)) a b -> b #

basicIndex :: Proxy * a -> Int -> a #

Bounded (Proxy k s) 

Methods

minBound :: Proxy k s #

maxBound :: Proxy k s #

Enum (Proxy k s) 

Methods

succ :: Proxy k s -> Proxy k s #

pred :: Proxy k s -> Proxy k s #

toEnum :: Int -> Proxy k s #

fromEnum :: Proxy k s -> Int #

enumFrom :: Proxy k s -> [Proxy k s] #

enumFromThen :: Proxy k s -> Proxy k s -> [Proxy k s] #

enumFromTo :: Proxy k s -> Proxy k s -> [Proxy k s] #

enumFromThenTo :: Proxy k s -> Proxy k s -> Proxy k s -> [Proxy k s] #

Eq (Proxy k s) 

Methods

(==) :: Proxy k s -> Proxy k s -> Bool #

(/=) :: Proxy k s -> Proxy k s -> Bool #

Ord (Proxy k s) 

Methods

compare :: Proxy k s -> Proxy k s -> Ordering #

(<) :: Proxy k s -> Proxy k s -> Bool #

(<=) :: Proxy k s -> Proxy k s -> Bool #

(>) :: Proxy k s -> Proxy k s -> Bool #

(>=) :: Proxy k s -> Proxy k s -> Bool #

max :: Proxy k s -> Proxy k s -> Proxy k s #

min :: Proxy k s -> Proxy k s -> Proxy k s #

Read (Proxy k s) 
Show (Proxy k s) 

Methods

showsPrec :: Int -> Proxy k s -> ShowS #

show :: Proxy k s -> String #

showList :: [Proxy k s] -> ShowS #

Ix (Proxy k s) 

Methods

range :: (Proxy k s, Proxy k s) -> [Proxy k s] #

index :: (Proxy k s, Proxy k s) -> Proxy k s -> Int #

unsafeIndex :: (Proxy k s, Proxy k s) -> Proxy k s -> Int

inRange :: (Proxy k s, Proxy k s) -> Proxy k s -> Bool #

rangeSize :: (Proxy k s, Proxy k s) -> Int #

unsafeRangeSize :: (Proxy k s, Proxy k s) -> Int

Generic (Proxy k t) 

Associated Types

type Rep (Proxy k t) :: * -> * #

Methods

from :: Proxy k t -> Rep (Proxy k t) x #

to :: Rep (Proxy k t) x -> Proxy k t #

Semigroup (Proxy k s) 

Methods

(<>) :: Proxy k s -> Proxy k s -> Proxy k s #

sconcat :: NonEmpty (Proxy k s) -> Proxy k s #

stimes :: Integral b => b -> Proxy k s -> Proxy k s #

Monoid (Proxy k s) 

Methods

mempty :: Proxy k s #

mappend :: Proxy k s -> Proxy k s -> Proxy k s #

mconcat :: [Proxy k s] -> Proxy k s #

NFData (Proxy k a)

Since: 1.4.0.0

Methods

rnf :: Proxy k a -> () #

type Rep1 (Proxy *) 
type Rep1 (Proxy *) = D1 (MetaData "Proxy" "Data.Proxy" "base" False) (C1 (MetaCons "Proxy" PrefixI False) U1)
type Dim (Proxy *) 
type Dim (Proxy *) = Z
type Rep (Proxy k t) 
type Rep (Proxy k t) = D1 (MetaData "Proxy" "Data.Proxy" "base" False) (C1 (MetaCons "Proxy" PrefixI False) U1)

type family (xs :: [α]) ++ (ys :: [α]) :: [α] Source #

Concaternation of type level lists.

Instances

type (++) α ([] α) ys Source # 
type (++) α ([] α) ys = ys
type (++) α ((:) α x xs) ys Source # 
type (++) α ((:) α x xs) ys = (:) α x ((++) α xs ys)

type family Len (xs :: [α]) :: * Source #

Length of type list expressed as type level naturals from fixed-vector.

Instances

type Len α ([] α) Source # 
type Len α ([] α) = Z
type Len α ((:) α x xs) Source # 
type Len α ((:) α x xs) = S (Len α xs)

type family Wrap (f :: α -> β) (a :: [α]) :: [β] Source #

Wrap every element of list into type constructor

Instances

type Wrap β α f ([] α) Source # 
type Wrap β α f ([] α) = [] β
type Wrap β α f ((:) α x xs) Source # 
type Wrap β α f ((:) α x xs) = (:) β (f x) (Wrap β α f xs)

type family HomList n (a :: α) :: [α] Source #

Homogeneous type list with length n and element of type a. It uses type level natural defined in fixed-vector.

Instances

type HomList α Z a Source # 
type HomList α Z a = [] α
type HomList α (S n) a Source # 
type HomList α (S n) a = (:) α a (HomList α n a)

Type classes

class Arity (Len xs) => Arity xs where Source #

Type class for dealing with N-ary function in generic way. Both accum and apply work with accumulator data types which are polymorphic. So it's only possible to write functions which rearrange elements in vector using plain ADT. It's possible to get around it by using GADT as accumulator (See ArityC and function which use it)

This is also somewhat a kitchen sink module. It contains witnesses which could be used to prove type equalities or to bring instance in scope.

Methods

accum :: (forall a as. t (a ': as) -> a -> t as) -> (t '[] -> b) -> t xs -> Fn xs b Source #

Fold over N elements exposed as N-ary function.

apply :: (forall a as. t (a ': as) -> (a, t as)) -> t xs -> ContVec xs Source #

Apply values to N-ary function

applyM :: Monad m => (forall a as. t (a ': as) -> m (a, t as)) -> t xs -> m (ContVec xs) Source #

Apply value to N-ary function using monadic actions

accumTy :: (forall a as. t (a ': as) -> f a -> t as) -> (t '[] -> b) -> t xs -> Fn (Wrap f xs) b Source #

Analog of accum

applyTy :: (forall a as. t (a ': as) -> (f a, t as)) -> t xs -> ContVecF xs f Source #

Analog of apply which allows to works with vectors which elements are wrapped in the newtype constructor.

arity :: p xs -> Int Source #

Size of type list as integer.

witWrapped :: WitWrapped f xs Source #

witConcat :: Arity ys => WitConcat xs ys Source #

witNestedFun :: WitNestedFun xs ys r Source #

witLenWrap :: WitLenWrap f xs Source #

Instances

Arity ([] *) Source # 

Methods

accum :: (forall a as. t ((* ': a) as) -> a -> t as) -> (t [*] -> b) -> t [*] -> Fn [*] b Source #

apply :: (forall a as. t ((* ': a) as) -> (a, t as)) -> t [*] -> ContVec [*] Source #

applyM :: Monad m => (forall a as. t ((* ': a) as) -> m (a, t as)) -> t [*] -> m (ContVec [*]) Source #

accumTy :: (forall a as. t ((* ': a) as) -> f a -> t as) -> (t [*] -> b) -> t [*] -> Fn (Wrap * * f [*]) b Source #

applyTy :: (forall a as. t ((* ': a) as) -> (f a, t as)) -> t [*] -> ContVecF * [*] f Source #

arity :: p [*] -> Int Source #

witWrapped :: WitWrapped f [*] Source #

witConcat :: Arity ys => WitConcat [*] ys Source #

witNestedFun :: WitNestedFun [*] ys r Source #

witLenWrap :: WitLenWrap f [*] Source #

Arity xs => Arity ((:) * x xs) Source # 

Methods

accum :: (forall a as. t ((* ': a) as) -> a -> t as) -> (t [*] -> b) -> t ((* ': x) xs) -> Fn ((* ': x) xs) b Source #

apply :: (forall a as. t ((* ': a) as) -> (a, t as)) -> t ((* ': x) xs) -> ContVec ((* ': x) xs) Source #

applyM :: Monad m => (forall a as. t ((* ': a) as) -> m (a, t as)) -> t ((* ': x) xs) -> m (ContVec ((* ': x) xs)) Source #

accumTy :: (forall a as. t ((* ': a) as) -> f a -> t as) -> (t [*] -> b) -> t ((* ': x) xs) -> Fn (Wrap * * f ((* ': x) xs)) b Source #

applyTy :: (forall a as. t ((* ': a) as) -> (f a, t as)) -> t ((* ': x) xs) -> ContVecF * ((* ': x) xs) f Source #

arity :: p ((* ': x) xs) -> Int Source #

witWrapped :: WitWrapped f ((* ': x) xs) Source #

witConcat :: Arity ys => WitConcat ((* ': x) xs) ys Source #

witNestedFun :: WitNestedFun ((* ': x) xs) ys r Source #

witLenWrap :: WitLenWrap f ((* ': x) xs) Source #

class Arity xs => ArityC c xs where Source #

Declares that every type in list satisfy constraint c

Minimal complete definition

witAllInstances

Instances

ArityC c ([] *) Source # 
(c x, ArityC c xs) => ArityC c ((:) * x xs) Source # 

Methods

witAllInstances :: WitAllInstances * c ((* ': x) xs) Source #

class Arity (Elems v) => HVector v where Source #

Type class for heterogeneous vectors. Instance should specify way to construct and deconstruct itself

Note that this type class is extremely generic. Almost any single constructor data type could be made instance. It could be monomorphic, it could be polymorphic in some or all fields it doesn't matter. Only law instance should obey is:

inspect v construct = v

Default implementation which uses Generic is provided.

Associated Types

type Elems v :: [*] Source #

Methods

construct :: Fun (Elems v) v Source #

Function for constructing vector

construct :: (Generic v, GHVector (Rep v), GElems (Rep v) ~ Elems v) => Fun (Elems v) v Source #

Function for constructing vector

inspect :: v -> Fun (Elems v) a -> a Source #

Function for deconstruction of vector. It applies vector's elements to N-ary function.

inspect :: (Generic v, GHVector (Rep v), GElems (Rep v) ~ Elems v) => v -> Fun (Elems v) a -> a Source #

Function for deconstruction of vector. It applies vector's elements to N-ary function.

Instances

HVector () Source #

Unit is empty heterogeneous vector

Associated Types

type Elems () :: [*] Source #

Methods

construct :: Fun (Elems ()) () Source #

inspect :: () -> Fun (Elems ()) a -> a Source #

HVector (Complex a) Source # 

Associated Types

type Elems (Complex a) :: [*] Source #

Methods

construct :: Fun (Elems (Complex a)) (Complex a) Source #

inspect :: Complex a -> Fun (Elems (Complex a)) a -> a Source #

Arity xs => HVector (ContVec xs) Source # 

Associated Types

type Elems (ContVec xs) :: [*] Source #

Methods

construct :: Fun (Elems (ContVec xs)) (ContVec xs) Source #

inspect :: ContVec xs -> Fun (Elems (ContVec xs)) a -> a Source #

Arity xs => HVector (VecList xs) Source # 

Associated Types

type Elems (VecList xs) :: [*] Source #

Methods

construct :: Fun (Elems (VecList xs)) (VecList xs) Source #

inspect :: VecList xs -> Fun (Elems (VecList xs)) a -> a Source #

Arity xs => HVector (HVec xs) Source # 

Associated Types

type Elems (HVec xs) :: [*] Source #

Methods

construct :: Fun (Elems (HVec xs)) (HVec xs) Source #

inspect :: HVec xs -> Fun (Elems (HVec xs)) a -> a Source #

HVector (a, b) Source # 

Associated Types

type Elems (a, b) :: [*] Source #

Methods

construct :: Fun (Elems (a, b)) (a, b) Source #

inspect :: (a, b) -> Fun (Elems (a, b)) a -> a Source #

(Unbox n a, HomArity n a) => HVector (Vec n a) Source # 

Associated Types

type Elems (Vec n a) :: [*] Source #

Methods

construct :: Fun (Elems (Vec n a)) (Vec n a) Source #

inspect :: Vec n a -> Fun (Elems (Vec n a)) a -> a Source #

(Storable a, HomArity n a) => HVector (Vec n a) Source # 

Associated Types

type Elems (Vec n a) :: [*] Source #

Methods

construct :: Fun (Elems (Vec n a)) (Vec n a) Source #

inspect :: Vec n a -> Fun (Elems (Vec n a)) a -> a Source #

(Prim a, HomArity n a) => HVector (Vec n a) Source # 

Associated Types

type Elems (Vec n a) :: [*] Source #

Methods

construct :: Fun (Elems (Vec n a)) (Vec n a) Source #

inspect :: Vec n a -> Fun (Elems (Vec n a)) a -> a Source #

HomArity n a => HVector (Vec n a) Source # 

Associated Types

type Elems (Vec n a) :: [*] Source #

Methods

construct :: Fun (Elems (Vec n a)) (Vec n a) Source #

inspect :: Vec n a -> Fun (Elems (Vec n a)) a -> a Source #

(Arity (Wrap * * f xs), Arity xs) => HVector (HVecF xs f) Source #

It's not possible to remove constrain Arity (Wrap f xs) because it's required by superclass and we cannot prove it for all f. witWrapped allow to generate proofs for terms

Associated Types

type Elems (HVecF xs f) :: [*] Source #

Methods

construct :: Fun (Elems (HVecF xs f)) (HVecF xs f) Source #

inspect :: HVecF xs f -> Fun (Elems (HVecF xs f)) a -> a Source #

HVector (a, b, c) Source # 

Associated Types

type Elems (a, b, c) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c)) (a, b, c) Source #

inspect :: (a, b, c) -> Fun (Elems (a, b, c)) a -> a Source #

HVector (a, b, c, d) Source # 

Associated Types

type Elems (a, b, c, d) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d)) (a, b, c, d) Source #

inspect :: (a, b, c, d) -> Fun (Elems (a, b, c, d)) a -> a Source #

HVector (a, b, c, d, e) Source # 

Associated Types

type Elems (a, b, c, d, e) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e)) (a, b, c, d, e) Source #

inspect :: (a, b, c, d, e) -> Fun (Elems (a, b, c, d, e)) a -> a Source #

HVector (a, b, c, d, e, f) Source # 

Associated Types

type Elems (a, b, c, d, e, f) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f)) (a, b, c, d, e, f) Source #

inspect :: (a, b, c, d, e, f) -> Fun (Elems (a, b, c, d, e, f)) a -> a Source #

HVector (a, b, c, d, e, f, g) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g)) (a, b, c, d, e, f, g) Source #

inspect :: (a, b, c, d, e, f, g) -> Fun (Elems (a, b, c, d, e, f, g)) a -> a Source #

HVector (a, b, c, d, e, f, g, h) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h)) (a, b, c, d, e, f, g, h) Source #

inspect :: (a, b, c, d, e, f, g, h) -> Fun (Elems (a, b, c, d, e, f, g, h)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i)) (a, b, c, d, e, f, g, h, i) Source #

inspect :: (a, b, c, d, e, f, g, h, i) -> Fun (Elems (a, b, c, d, e, f, g, h, i)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j)) (a, b, c, d, e, f, g, h, i, j) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k)) (a, b, c, d, e, f, g, h, i, j, k) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l)) (a, b, c, d, e, f, g, h, i, j, k, l) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m)) (a, b, c, d, e, f, g, h, i, j, k, l, m) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a') Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a') :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a')) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a') Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a') -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a')) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b') Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b') :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b')) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b') Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b') -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b')) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c') Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c') :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c')) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c') Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c') -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c')) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d') Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d') :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d')) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d') Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d') -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d')) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e') Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e') :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e')) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e') Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e') -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e')) a -> a Source #

HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e', f') Source # 

Associated Types

type Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e', f') :: [*] Source #

Methods

construct :: Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e', f')) (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e', f') Source #

inspect :: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e', f') -> Fun (Elems (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, a', b', c', d', e', f')) a -> a Source #

class Arity (ElemsF v) => HVectorF v where Source #

Type class for partially homogeneous vector where every element in the vector have same type constructor. Vector itself is parametrized by that constructor

Minimal complete definition

inspectF, constructF

Associated Types

type ElemsF v :: [*] Source #

Elements of the vector without type constructors

Methods

inspectF :: v f -> TFun f (ElemsF v) a -> a Source #

constructF :: TFun f (ElemsF v) (v f) Source #

Instances

Arity xs => HVectorF (VecListF xs) Source # 

Associated Types

type ElemsF (VecListF xs :: (* -> *) -> *) :: [*] Source #

Methods

inspectF :: VecListF xs f -> TFun * f (ElemsF (VecListF xs)) a -> a Source #

constructF :: TFun * f (ElemsF (VecListF xs)) (VecListF xs f) Source #

Arity xs => HVectorF (HVecF xs) Source # 

Associated Types

type ElemsF (HVecF xs :: (* -> *) -> *) :: [*] Source #

Methods

inspectF :: HVecF xs f -> TFun * f (ElemsF (HVecF xs)) a -> a Source #

constructF :: TFun * f (ElemsF (HVecF xs)) (HVecF xs f) Source #

Arity xs => HVectorF (ContVecF * xs) Source # 

Associated Types

type ElemsF (ContVecF * xs :: (* -> *) -> *) :: [*] Source #

Methods

inspectF :: ContVecF * xs f -> TFun * f (ElemsF (ContVecF * xs)) a -> a Source #

constructF :: TFun * f (ElemsF (ContVecF * xs)) (ContVecF * xs f) Source #

Witnesses

data WitWrapped f xs where Source #

Witness that observe fact that if we have instance Arity xs than we have instance Arity (Wrap f xs).

Constructors

WitWrapped :: Arity (Wrap f xs) => WitWrapped f xs 

data WitConcat xs ys where Source #

Witness that observe fact that (Arity xs, Arity ys) implies Arity (xs++ys)

Constructors

WitConcat :: Arity (xs ++ ys) => WitConcat xs ys 

data WitNestedFun xs ys r where Source #

Observes fact that Fn (xs++ys) r ~ Fn xs (Fn ys r)

Constructors

WitNestedFun :: Fn (xs ++ ys) r ~ Fn xs (Fn ys r) => WitNestedFun xs ys r 

data WitLenWrap :: (* -> *) -> [*] -> * where Source #

Observe fact than Len xs ~ Len (Wrap f xs)

Constructors

WitLenWrap :: Len xs ~ Len (Wrap f xs) => WitLenWrap f xs 

data WitWrapIndex f n xs where Source #

Proofs for the indexing of wrapped type lists.

Constructors

WitWrapIndex :: (ValueAt n (Wrap f xs) ~ f (ValueAt n xs), Index n (Wrap f xs), Arity (Wrap f xs)) => WitWrapIndex f n xs 

data WitAllInstances c xs where Source #

Witness that all elements of type list satisfy predicate c.

Constructors

WitAllInstancesNil :: WitAllInstances c '[] 
WitAllInstancesCons :: c x => WitAllInstances c xs -> WitAllInstances c (x ': xs) 

CPS-encoded vector

newtype ContVec xs Source #

CPS-encoded heterogeneous vector.

Constructors

ContVec 

Fields

Instances

Arity xs => HVector (ContVec xs) Source # 

Associated Types

type Elems (ContVec xs) :: [*] Source #

Methods

construct :: Fun (Elems (ContVec xs)) (ContVec xs) Source #

inspect :: ContVec xs -> Fun (Elems (ContVec xs)) a -> a Source #

type Elems (ContVec xs) Source # 
type Elems (ContVec xs) = xs

newtype ContVecF xs f Source #

CPS-encoded partially heterogeneous vector.

Constructors

ContVecF (forall r. TFun f xs r -> r) 

Instances

Arity xs => HVectorF (ContVecF * xs) Source # 

Associated Types

type ElemsF (ContVecF * xs :: (* -> *) -> *) :: [*] Source #

Methods

inspectF :: ContVecF * xs f -> TFun * f (ElemsF (ContVecF * xs)) a -> a Source #

constructF :: TFun * f (ElemsF (ContVecF * xs)) (ContVecF * xs f) Source #

type ElemsF (ContVecF * xs) Source # 
type ElemsF (ContVecF * xs) = xs

cons :: x -> ContVec xs -> ContVec (x ': xs) Source #

Cons element to the vector

consF :: f x -> ContVecF xs f -> ContVecF (x ': xs) f Source #

Cons element to the vector

Interop with homogeneous vectors

class (Arity n, Arity (HomList n a)) => HomArity n a where Source #

Conversion between homogeneous and heterogeneous N-ary functions.

Minimal complete definition

toHeterogeneous, toHomogeneous

Methods

toHeterogeneous :: Fun n a r -> Fun (HomList n a) r Source #

Convert n-ary homogeneous function to heterogeneous.

toHomogeneous :: Fun (HomList n a) r -> Fun n a r Source #

Convert heterogeneous n-ary function to homogeneous.

Instances

HomArity Z a Source # 

Methods

toHeterogeneous :: Fun Z a r -> Fun (HomList * Z a) r Source #

toHomogeneous :: Fun (HomList * Z a) r -> Fun Z a r Source #

HomArity n a => HomArity (S n) a Source # 

Methods

toHeterogeneous :: Fun (S n) a r -> Fun (HomList * (S n) a) r Source #

toHomogeneous :: Fun (HomList * (S n) a) r -> Fun (S n) a r Source #

homInspect :: (Vector v a, HomArity (Dim v) a) => v a -> Fun (HomList (Dim v) a) r -> r Source #

Default implementation of inspect for homogeneous vector.

homConstruct :: forall v a. (Vector v a, HomArity (Dim v) a) => Fun (HomList (Dim v) a) (v a) Source #

Default implementation of construct for homogeneous vector.

Operations of Fun

Primitives for Fun

curryFun :: Fun (x ': xs) r -> x -> Fun xs r Source #

Apply single parameter to function

uncurryFun :: (x -> Fun xs r) -> Fun (x ': xs) r Source #

Uncurry N-ary function.

uncurryFun2 :: Arity xs => (x -> y -> Fun xs (Fun ys r)) -> Fun (x ': xs) (Fun (y ': ys) r) Source #

curryMany :: forall xs ys r. Arity xs => Fun (xs ++ ys) r -> Fun xs (Fun ys r) Source #

Curry first n arguments of N-ary function.

constFun :: Fun xs r -> Fun (x ': xs) r Source #

Add one parameter to function which is ignored.

stepFun :: (Fun xs a -> Fun ys b) -> Fun (x ': xs) a -> Fun (x ': ys) b Source #

Transform function but leave outermost parameter untouched.

Primitives for TFun

curryTFun :: TFun f (x ': xs) r -> f x -> TFun f xs r Source #

Apply single parameter to function

uncurryTFun :: (f x -> TFun f xs r) -> TFun f (x ': xs) r Source #

Uncurry single parameter

uncurryTFun2 :: (Arity xs, Arity ys) => (f x -> f y -> TFun f xs (TFun f ys r)) -> TFun f (x ': xs) (TFun f (y ': ys) r) Source #

Uncurry two parameters for nested TFun.

shuffleTF :: forall f x xs r. Arity xs => (x -> TFun f xs r) -> TFun f xs (x -> r) Source #

Move first argument of function to its result. This function is useful for implementation of lens.

More complicated functions

concatF :: (Arity xs, Arity ys) => (a -> b -> c) -> Fun xs a -> Fun ys b -> Fun (xs ++ ys) c Source #

Concatenate n-ary functions. This function combine results of both N-ary functions and merge their parameters into single list.

shuffleF :: forall x xs r. Arity xs => (x -> Fun xs r) -> Fun xs (x -> r) Source #

Move first argument of function to its result. This function is useful for implementation of lens.

lensWorkerF :: forall f r x y xs. (Functor f, Arity xs) => (x -> f y) -> Fun (y ': xs) r -> Fun (x ': xs) (f r) Source #

Helper for lens implementation.

class Arity n => Index n xs where Source #

Indexing of vectors

Minimal complete definition

getF, putF, lensF, lensChF, witWrapIndex

Associated Types

type ValueAt n xs :: * Source #

Type at position n

type NewElems n xs a :: [*] Source #

List of types with n'th element replaced by a.

Methods

getF :: n -> Fun xs (ValueAt n xs) Source #

Getter function for vectors

putF :: n -> ValueAt n xs -> Fun xs r -> Fun xs r Source #

Putter function. It applies value x to nth parameter of function.

lensF :: (Functor f, v ~ ValueAt n xs) => n -> (v -> f v) -> Fun xs r -> Fun xs (f r) Source #

Helper for implementation of lens

lensChF :: Functor f => n -> (ValueAt n xs -> f a) -> Fun (NewElems n xs a) r -> Fun xs (f r) Source #

Helper for type-changing lens

witWrapIndex :: WitWrapIndex f n xs Source #

Instances

Arity xs => Index Z ((:) * x xs) Source # 

Associated Types

type ValueAt Z ((:) * x xs :: [*]) :: * Source #

type NewElems Z ((:) * x xs :: [*]) a :: [*] Source #

Methods

getF :: Z -> Fun ((* ': x) xs) (ValueAt Z ((* ': x) xs)) Source #

putF :: Z -> ValueAt Z ((* ': x) xs) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) r Source #

lensF :: (Functor f, (* ~ v) (ValueAt Z ((* ': x) xs))) => Z -> (v -> f v) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) (f r) Source #

lensChF :: Functor f => Z -> (ValueAt Z ((* ': x) xs) -> f a) -> Fun (NewElems Z ((* ': x) xs) a) r -> Fun ((* ': x) xs) (f r) Source #

witWrapIndex :: WitWrapIndex f Z ((* ': x) xs) Source #

Index n xs => Index (S n) ((:) * x xs) Source # 

Associated Types

type ValueAt (S n) ((:) * x xs :: [*]) :: * Source #

type NewElems (S n) ((:) * x xs :: [*]) a :: [*] Source #

Methods

getF :: S n -> Fun ((* ': x) xs) (ValueAt (S n) ((* ': x) xs)) Source #

putF :: S n -> ValueAt (S n) ((* ': x) xs) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) r Source #

lensF :: (Functor f, (* ~ v) (ValueAt (S n) ((* ': x) xs))) => S n -> (v -> f v) -> Fun ((* ': x) xs) r -> Fun ((* ': x) xs) (f r) Source #

lensChF :: Functor f => S n -> (ValueAt (S n) ((* ': x) xs) -> f a) -> Fun (NewElems (S n) ((* ': x) xs) a) r -> Fun ((* ': x) xs) (f r) Source #

witWrapIndex :: WitWrapIndex f (S n) ((* ': x) xs) Source #