fixed-vector-hetero-0.3.1.1: Generic heterogeneous vectors

Safe HaskellNone
LanguageHaskell98

Data.Vector.HFixed.Cont

Contents

Description

CPS encoded heterogeneous vectors.

Synopsis

CPS-encoded vector

Type classes

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 = b Source 
type Fn ((:) * a as) b = a -> Fn as b Source 

newtype Fun as b Source

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

Constructors

Fun 

Fields

unFun :: Fn as b
 

Instances

Arity xs => Monad (Fun xs) Source 
Arity xs => Functor (Fun xs) Source 
Arity xs => Applicative (Fun xs) Source 

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

unTFun :: Fn (Wrap f as) b
 

Instances

Arity xs => Monad (TFun * f xs) Source 
Arity xs => Functor (TFun * f xs) Source 
Arity xs => Applicative (TFun * f xs) Source 

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 Source

Arguments

:: (forall a as. t (a : as) -> a -> t as)

Step function. Applies element to accumulator.

-> (t `[]` -> b)

Extract value from accumulator.

-> t xs

Initial state.

-> Fn xs b 

Fold over N elements exposed as N-ary function.

apply Source

Arguments

:: (forall a as. t (a : as) -> (a, t as))

Extract value to be applied to function.

-> t xs

Initial state.

-> ContVec xs 

Apply values to N-ary function

applyM Source

Arguments

:: Monad m 
=> (forall a as. t (a : as) -> m (a, t as))

Extract value to be applied to function

-> t xs

Initial state

-> m (ContVec xs) 

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 
Arity xs => Arity ((:) * 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.

Minimal complete definition

Nothing

Associated Types

type Elems v :: [*] Source

Methods

construct :: 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.

Instances

HVector () Source

Unit is empty heterogeneous vector

HVector (Complex a) Source 
Arity xs => HVector (ContVec xs) Source 
Arity xs => HVector (VecList xs) Source 
Arity xs => HVector (HVec xs) Source 
HVector (a, b) Source 
(Storable a, HomArity n a) => HVector (Vec n a) Source 
(Unbox n a, HomArity n a) => HVector (Vec n a) Source 
(Prim a, HomArity n a) => HVector (Vec n a) Source 
HomArity n a => HVector (Vec n 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

HVector (a, b, c) Source 
HVector (a, b, c, d) Source 
HVector (a, b, c, d, e) Source 
HVector (a, b, c, d, e, f) Source 
HVector (a, b, c, d, e, f, g) Source 
HVector (a, b, c, d, e, f, g, h) Source 
HVector (a, b, c, d, e, f, g, h, i) Source 
HVector (a, b, c, d, e, f, g, h, i, j) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) Source 
HVector (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) 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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 

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

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

class Arity n => Index n xs Source

Indexing of vectors

Minimal complete definition

getF, putF, lensF, lensChF, witWrapIndex

Associated Types

type ValueAt n xs :: * Source

Type at position n

Instances

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

type family Wrap f a :: [β] Source

Wrap every element of list into type constructor

Instances

type Wrap k k1 f ([] k1) = [] k Source 
type Wrap k k1 f ((:) k1 x xs) = (:) k (f x) (Wrap k k1 f xs) Source 

CPS-encoded vector

newtype ContVec xs Source

CPS-encoded heterogeneous vector.

Constructors

ContVec 

Fields

runContVec :: forall r. Fun xs r -> r
 

Instances

Arity xs => HVector (ContVec xs) Source 
type Elems (ContVec xs) = xs Source 

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 
type ElemsF (ContVecF * xs) = xs Source 

Other data types

data VecList :: [*] -> * where Source

List like heterogeneous vector.

Constructors

Nil :: VecList `[]` 
Cons :: x -> VecList xs -> VecList (x : xs) 

Instances

Arity xs => HVector (VecList xs) Source 
type Elems (VecList xs) = xs Source 

data VecListF xs f where Source

List-like vector

Constructors

NilF :: VecListF `[]` f 
ConsF :: f x -> VecListF xs f -> VecListF (x : xs) f 

Instances

Arity xs => HVectorF (VecListF xs) Source 
type ElemsF (VecListF xs) = xs Source 

Conversion to/from vector

cvec :: (HVector v, Elems v ~ xs) => v -> ContVec xs Source

Convert heterogeneous vector to CPS form

vector :: (HVector v, Elems v ~ xs) => ContVec xs -> v Source

Convert CPS-vector to heterogeneous vector

cvecF :: HVectorF v => v f -> ContVecF (ElemsF v) f Source

vectorF :: HVectorF v => ContVecF (ElemsF v) f -> v f Source

Position based functions

head :: forall x xs. Arity xs => ContVec (x : xs) -> x Source

Head of vector

tail :: ContVec (x : xs) -> ContVec xs Source

Tail of CPS-encoded vector

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

concat :: Arity xs => ContVec xs -> ContVec ys -> ContVec (xs ++ ys) Source

Concatenate two vectors

Indexing

index :: Index n xs => ContVec xs -> n -> ValueAt n xs Source

Get value at nth position.

set :: Index n xs => n -> ValueAt n xs -> ContVec xs -> ContVec xs Source

Set value on nth position.

Constructors

mk1 :: a -> ContVec `[a]` Source

mk2 :: a -> b -> ContVec `[a, b]` Source

mk3 :: a -> b -> c -> ContVec `[a, b, c]` Source

mk4 :: a -> b -> c -> d -> ContVec `[a, b, c, d]` Source

mk5 :: a -> b -> c -> d -> e -> ContVec `[a, b, c, d, e]` Source

Folds and unfolds

foldl :: forall xs c b. ArityC c xs => Proxy c -> (forall a. c a => b -> a -> b) -> b -> ContVec xs -> b Source

Left fold over vector

foldr :: forall xs c b. ArityC c xs => Proxy c -> (forall a. c a => a -> b -> b) -> b -> ContVec xs -> b Source

Right fold over vector

unfoldr :: forall xs c b. ArityC c xs => Proxy c -> (forall a. c a => b -> (a, b)) -> b -> ContVec xs Source

Unfold vector.

Polymorphic values

replicate :: forall xs c. ArityC c xs => Proxy c -> (forall x. c x => x) -> ContVec xs Source

Replicate polymorphic value n times. Concrete instance for every element is determined by their respective types.

replicateM :: forall xs c m. (ArityC c xs, Monad m) => Proxy c -> (forall x. c x => m x) -> m (ContVec xs) Source

Replicate monadic action n times.

replicateF :: forall f xs. Arity xs => (forall a. f a) -> ContVecF xs f Source

zipMono :: forall xs c. ArityC c xs => Proxy c -> (forall a. c a => a -> a -> a) -> ContVec xs -> ContVec xs -> ContVec xs Source

Zip two heterogeneous vectors

zipMonoF :: forall xs f g h c. ArityC c xs => Proxy c -> (forall a. c a => f a -> g a -> h a) -> ContVecF xs f -> ContVecF xs g -> ContVecF xs h Source

Zip two heterogeneous vectors

zipFold :: forall xs c m. (ArityC c xs, Monoid m) => Proxy c -> (forall a. c a => a -> a -> m) -> ContVec xs -> ContVec xs -> m Source

Zip vector and fold result using monoid

monomorphize :: forall c xs a. ArityC c xs => Proxy c -> (forall x. c x => x -> a) -> ContVec xs -> ContVec (Len xs) a Source

Convert heterogeneous vector to homogeneous

monomorphizeF :: forall c xs a f. ArityC c xs => Proxy c -> (forall x. c x => f x -> a) -> ContVecF xs f -> ContVec (Len xs) a Source

Convert heterogeneous vector to homogeneous

Vector parametrized with type constructor

mapFunctor :: Arity xs => (forall a. f a -> g a) -> ContVecF xs f -> ContVecF xs g Source

Map functor.

sequence :: (Arity xs, Monad m) => ContVecF xs m -> m (ContVec xs) Source

Sequence vector's elements

sequenceA :: (Arity xs, Applicative f) => ContVecF xs f -> f (ContVec xs) Source

Sequence vector's elements

sequenceF :: (Arity xs, Monad m) => ContVecF xs (m `Compose` f) -> m (ContVecF xs f) Source

Sequence vector's elements

sequenceAF :: (Arity xs, Applicative f) => ContVecF xs (f `Compose` g) -> f (ContVecF xs g) Source

Sequence vector's elements

distribute :: forall f xs. (Arity xs, Functor f) => f (ContVec xs) -> ContVecF xs f Source

distributeF :: forall f g xs. (Arity xs, Functor f) => f (ContVecF xs g) -> ContVecF xs (f `Compose` g) Source

wrap :: Arity xs => (forall a. a -> f a) -> ContVec xs -> ContVecF xs f Source

Wrap every value in the vector into type constructor.

unwrap :: Arity xs => (forall a. f a -> a) -> ContVecF xs f -> ContVec xs Source

Unwrap every value in the vector from the type constructor.