Data.Vec.Base
 Contents Vector Types List-like functions Matrix Types
Synopsis
data a :. b = !a :. !b
class ShowVec v where
 showVec :: v -> String
type Vec2 a = a :. (a :. ())
type Vec3 a = a :. Vec2 a
type Vec4 a = a :. Vec3 a
type Vec5 a = a :. Vec4 a
type Vec6 a = a :. Vec5 a
type Vec7 a = a :. Vec6 a
type Vec8 a = a :. Vec7 a
type Vec9 a = a :. Vec8 a
type Vec10 a = a :. Vec9 a
type Vec11 a = a :. Vec10 a
type Vec12 a = a :. Vec11 a
type Vec13 a = a :. Vec12 a
type Vec14 a = a :. Vec13 a
type Vec15 a = a :. Vec14 a
type Vec16 a = a :. Vec15 a
type Vec17 a = a :. Vec16 a
type Vec18 a = a :. Vec17 a
type Vec19 a = a :. Vec18 a
class Vec n a v | n a -> v, v -> n a where
 mkVec :: n -> a -> v fromList :: [a] -> v getElem :: Int -> v -> a setElem :: Int -> a -> v -> v
vec :: Vec n a v => a -> v
class Access n a v | v -> a where
 get :: n -> v -> a set :: n -> a -> v -> v
class Head v a | v -> a where
class Tail v v_ | v -> v_ where
 tail :: v -> v_
class Map a b u v | u -> a, v -> b, b u -> v, a v -> u where
 map :: (a -> b) -> u -> v
class ZipWith a b c u v w | u -> a, v -> b, w -> c, u v c -> w where
 zipWith :: (a -> b -> c) -> u -> v -> w
class Fold a v | v -> a where
 fold :: (a -> a -> a) -> v -> a foldl :: (b -> a -> b) -> b -> v -> b foldr :: (a -> b -> b) -> b -> v -> b
reverse :: Reverse' () v v' => v -> v'
class Reverse' p v v' | p v -> v' where
 reverse' :: p -> v -> v'
class Append v1 v2 v3 | v1 v2 -> v3, v1 v3 -> v2 where
 append :: v1 -> v2 -> v3
class Take n v v' | n v -> v' where
 take :: n -> v -> v'
class Drop n v v' | n v -> v' where
 drop :: n -> v -> v'
class Last v a | v -> a where
 last :: v -> a
class Snoc v a v' | v a -> v', v' -> v a, v -> a where
 snoc :: v -> a -> v'
class Length v n | v -> n where
 length :: v -> Int
sum :: (Fold a v, Num a) => v -> a
product :: (Fold a v, Num a) => v -> a
maximum :: (Fold a v, Ord a) => v -> a
minimum :: (Fold a v, Ord a) => v -> a
toList :: Fold a v => v -> [a]
type Mat22 a = Vec2 (Vec2 a)
type Mat23 a = Vec2 (Vec3 a)
type Mat24 a = Vec2 (Vec4 a)
type Mat32 a = Vec3 (Vec2 a)
type Mat33 a = Vec3 (Vec3 a)
type Mat34 a = Vec3 (Vec4 a)
type Mat35 a = Vec3 (Vec5 a)
type Mat36 a = Vec3 (Vec6 a)
type Mat42 a = Vec4 (Vec2 a)
type Mat43 a = Vec4 (Vec3 a)
type Mat44 a = Vec4 (Vec4 a)
type Mat45 a = Vec4 (Vec5 a)
type Mat46 a = Vec4 (Vec6 a)
type Mat47 a = Vec4 (Vec7 a)
type Mat48 a = Vec4 (Vec8 a)
matToLists :: (Fold a v, Fold v m) => m -> [[a]]
matToList :: (Fold a v, Fold v m) => m -> [a]
matFromLists :: (Vec j a v, Vec i v m) => [[a]] -> m
matFromList :: forall i j v m a. (Vec i v m, Vec j a v, Nat i) => [a] -> m
Documentation
 data a :. b Source
The vector constructor. (:.) for vectors is like (:) for lists, and () takes the place of []. (The list of instances here is not meant to be readable.)
Constructors
 !a :. !b
Instances
 ZipWith a b c (a' :. u) (b' :. v) (c' :. w) => ZipWith a b c (a :. (a' :. u)) (b :. (b' :. v)) (c :. (c' :. w)) ZipWith a b c (a :. (a :. as)) (b :. ()) (c :. ()) ZipWith a b c (a :. ()) (b :. (b :. bs)) (c :. ()) ZipWith a b c (a :. ()) (b :. ()) (c :. ()) Snoc () a (a :. ()) Access N0 a (a :. v) Vec N1 a (a :. ()) Alternating N1 a (a :. ()) (Access n a r, Append p (a :. ()) p', GetDiagonal' (Succ n) p' (r :. m) v) => GetDiagonal' n p (r :. (r :. m)) v Map a b (a' :. u) (b' :. v) => Map a b (a :. (a' :. u)) (b :. (b' :. v)) Map a b (a :. ()) (b :. ()) (Append p (a :. v) x, Append p (a :. ()) y, ReplConsec' a y v z) => ReplConsec' a p (a :. v) (x :. z) (Access n a r, Append p (a :. ()) (a :. p)) => GetDiagonal' n p (r :. ()) (a :. p) Fold a (a' :. u) => Fold a (a :. (a' :. u)) Fold a (a :. ()) (Fractional a, Map (a :. r) r ((a :. r) :. rs) rs_, Map r (a :. r) rs_ ((a :. r) :. rs), Pivot a ((a :. r) :. ((a :. r) :. rs)), GaussElim a rs_) => GaussElim a ((a :. r) :. ((a :. r) :. rs)) (Num a, Pivot a (r :. ())) => GaussElim a (r :. ()) (Fractional a, NearZero a, Pivot1 a rs, Tail (a :. r) r, Map (a :. r) r ((a :. r) :. rs) (r :. rs'), Map r (a :. r) (r :. rs') ((a :. r) :. rs), Pivot1 a ((a :. r) :. rs), Pivot a (r :. rs')) => Pivot a ((a :. r) :. rs) Pivot a (() :. v) (Fractional a, NearZero a, Map a a (a :. r) (a :. r), ZipWith a a a (a :. r) (a :. r) (a :. r), Map (a :. r) (a :. r) ((a :. r) :. rs) ((a :. r) :. rs), Pivot1 a ((a :. r) :. rs)) => Pivot1 a ((a :. r) :. ((a :. r) :. rs)) (Fractional a, NearZero a, Map a a (a :. r) (a :. r)) => Pivot1 a ((a :. (a :. r)) :. ()) (Fractional a, NearZero a) => Pivot1 a ((a :. ()) :. ()) (Num a, Num (a :. (a :. (a :. v))), Fold a (a :. (a :. (a :. v))), Alternating (Succ (Succ (Succ n))) a (a :. (a :. (a :. v))), DropConsec (a :. (a :. (a :. v))) vv, Map (a :. (a :. (a :. v))) vv ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. m)) vmt, Transpose vmt vm, Map ((a :. (a :. v)) :. ((a :. (a :. v)) :. m_)) a vm (a :. (a :. (a :. v))), Det' a ((a :. (a :. v)) :. ((a :. (a :. v)) :. m_)), Vec (Succ (Succ (Succ n))) a (a :. (a :. (a :. v))), Vec (Succ (Succ (Succ n))) (a :. (a :. (a :. v))) ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. m)))) => Det' a ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. m))) Num a => Det' a ((a :. (a :. ())) :. ((a :. (a :. ())) :. ())) Reverse' (a :. p) v v' => Reverse' p (a :. v) v' (Append p (a :. v) x, Append p (a :. ()) y, DropConsec' y (a :. v) z) => DropConsec' p (a :. (a :. v)) (x :. z) DropConsec' p (a :. ()) (p :. ()) (SetDiagonal' (Succ n) v m, Access n a r) => SetDiagonal' n (a :. v) (r :. m) PackedVec (Vec4 Double) PackedVec (Vec4 Float) PackedVec (Vec4 Int) PackedVec (Vec3 Double) PackedVec (Vec3 Float) PackedVec (Vec3 Int) PackedVec (Vec2 Double) PackedVec (Vec2 Float) PackedVec (Vec2 Int) Access n a v => Access (Succ n) a (a :. v) Vec (Succ n) a (a' :. v) => Vec (Succ (Succ n)) a (a :. (a' :. v)) (Num a, Alternating n a (a :. v)) => Alternating (Succ n) a (a :. (a :. v)) Drop n (a :. v) v' => Drop (Succ n) (a :. (a :. v)) v' Take n v v' => Take (Succ n) (a :. v) (a :. v') (Eq a, Eq b) => Eq (a :. b) (Fractional a, Ord (a :. u), ZipWith a a a (a :. u) (a :. u) (a :. u), Map a a (a :. u) (a :. u), Vec (Succ l) a (a :. u), Show (a :. u)) => Fractional (a :. u) (Eq (a :. u), Show (a :. u), Num a, Map a a (a :. u) (a :. u), ZipWith a a a (a :. u) (a :. u) (a :. u), Vec (Succ l) a (a :. u)) => Num (a :. u) (Ord a, Ord b) => Ord (a :. b) (Read a, Read b) => Read (a :. b) (Show a, ShowVec v) => Show (a :. v) (Vec (Succ (Succ n)) a (a :. (a :. v)), Storable a, Storable (a :. v)) => Storable (a :. (a :. v)) Storable a => Storable (a :. ()) (Length (a :. v) (Succ n), Arbitrary a', Arbitrary (a :. v)) => Arbitrary (a' :. (a :. v)) Arbitrary a => Arbitrary (a :. ()) (Show a, ShowVec v) => ShowVec (a :. v) (Map (a :. r) r ((a :. r) :. rs) rs_, Map r (a :. r) rs_ ((a :. r) :. rs), Fold ((,) a (a :. r)) aas, ZipWith a a a (a :. r) (a :. r) (a :. r), Map a a (a :. r) (a :. r), ZipWith a (a :. r) ((,) a (a :. r)) r ((a :. r) :. rs) aas, Num a, BackSubstitute' rs_) => BackSubstitute' ((a :. r) :. ((a :. r) :. rs)) BackSubstitute' ((a :. r) :. ()) (Map (a :. r) r ((a :. r) :. rs) rs_, Map r (a :. r) rs_ ((a :. r) :. rs), Fold ((,) a (a :. r)) aas, ZipWith a a a (a :. r) (a :. r) (a :. r), Map a a (a :. r) (a :. r), ZipWith a (a :. r) ((,) a (a :. r)) r ((a :. r) :. rs) aas, Num a, NearZero a, BackSubstitute rs_) => BackSubstitute ((a :. r) :. ((a :. r) :. rs)) BackSubstitute ((a :. r) :. ()) Last (a' :. v) a => Last (a :. (a' :. v)) a Last (a :. ()) a Tail (a :. as) as Head (a :. as) a Transpose' vs vs' => Transpose' (() :. vs) vs' Snoc v a (a :. v) => Snoc (a :. v) a (a :. (a :. v)) Append (a' :. v1) v2 v3 => Append (a :. (a' :. v1)) v2 (a :. v3) Append (a :. ()) v (a :. v) Length v n => Length (a :. v) (Succ n) (Head xss_h xss_hh, Map xss_h xss_hh (xss_h :. xss_t) xs', Tail xss_h xss_ht, Map xss_h xss_ht (xss_h :. xss_t) xss_, Transpose' (xs :. xss_) xss') => Transpose' ((x :. xs) :. (xss_h :. xss_t)) ((x :. xs') :. xss') Transpose' ((x :. ()) :. ()) ((x :. ()) :. ()) (Vec (Succ n) s (s :. ra), Vec (Succ m) (s :. ra) ((s :. ra) :. a), Vec (Succ m) s (s :. rb), Vec (Succ n) (s :. rb) ((s :. rb) :. b), Transpose' ((s :. ra) :. a) ((s :. rb) :. b)) => Transpose ((s :. ra) :. a) ((s :. rb) :. b)
 class ShowVec v where Source
Helper to keep parentheses at bay. Just use show as usual.
Methods
 showVec :: v -> String Source
Instances
 ShowVec () (Show a, ShowVec v) => ShowVec (a :. v)
Vector Types
 type Vec2 a = a :. (a :. ()) Source
 type Vec3 a = a :. Vec2 a Source
 type Vec4 a = a :. Vec3 a Source
 type Vec5 a = a :. Vec4 a Source
 type Vec6 a = a :. Vec5 a Source
 type Vec7 a = a :. Vec6 a Source
 type Vec8 a = a :. Vec7 a Source
 type Vec9 a = a :. Vec8 a Source
 type Vec10 a = a :. Vec9 a Source
 type Vec11 a = a :. Vec10 a Source
 type Vec12 a = a :. Vec11 a Source
 type Vec13 a = a :. Vec12 a Source
 type Vec14 a = a :. Vec13 a Source
 type Vec15 a = a :. Vec14 a Source
 type Vec16 a = a :. Vec15 a Source
 type Vec17 a = a :. Vec16 a Source
 type Vec18 a = a :. Vec17 a Source
 type Vec19 a = a :. Vec18 a Source
 class Vec n a v | n a -> v, v -> n a where Source
The type constraint Vec n a v infers the vector type v from the length n, a type-level natural, and underlying component type a. So x :: Vec N4 a v => v declares x to be a 4-vector of as.
Methods
 mkVec :: n -> a -> v Source
Make a uniform vector of a given length. n is a type-level natural. Use vec when the length can be inferred.
 fromList :: [a] -> v Source
turn a list into a vector of inferred length
 getElem :: Int -> v -> a Source
get a vector element, which one is determined at runtime
 setElem :: Int -> a -> v -> v Source
set a vector element, which one is determined at runtime
Instances
 Vec N1 a (a :. ()) Vec N1 a (a :. ()) Vec (Succ n) a (a' :. v) => Vec (Succ (Succ n)) a (a :. (a' :. v)) Vec (Succ n) a (a' :. v) => Vec (Succ (Succ n)) a (a :. (a' :. v))
 vec :: Vec n a v => a -> v Source
Make a uniform vector. The length is inferred.
 class Access n a v | v -> a where Source
get or set a vector element, known at compile time. Use the Nat types to access vector components. For instance, get n0 gets the x component, set n2 44 sets the z component to 44.
Methods
 get :: n -> v -> a Source
 set :: n -> a -> v -> v Source
Instances
 Access N0 a (a :. v) Access N0 a (a :. v) Access n a v => Access (Succ n) a (a :. v) Access n a v => Access (Succ n) a (a :. v)
List-like functions
 class Head v a | v -> a where Source
The first element.
Methods
 head :: v -> a Source
Instances
 class Tail v v_ | v -> v_ where Source
All but the first element.
Methods
 tail :: v -> v_ Source
Instances
 (Tail v t, PackedVec v, PackedVec t) => Tail (Packed v) (Packed t) Tail (a :. as) as
 class Map a b u v | u -> a, v -> b, b u -> v, a v -> u where Source
Apply a function over each element in a vector. Constraint Map a b u v states that u is a vector of as, v is a vector of bs with the same length as u, and the function is of type a -> b.
Methods
 map :: (a -> b) -> u -> v Source
Instances
 (Map a b u v, PackedVec u, PackedVec v) => Map a b (Packed u) (Packed v) Map a b (a' :. u) (b' :. v) => Map a b (a :. (a' :. u)) (b :. (b' :. v)) Map a b (a :. ()) (b :. ())
 class ZipWith a b c u v w | u -> a, v -> b, w -> c, u v c -> w where Source
Combine two vectors using a binary function. The length of the result is the min of the lengths of the arguments. The constraint ZipWith a b c u v w states that u is a vector of as, v is a vector of bs, w is a vector of cs, and the binary function is of type a -> b -> c.
Methods
 zipWith :: (a -> b -> c) -> u -> v -> w Source
Instances
 (ZipWith a b c u v w, PackedVec u, PackedVec v, PackedVec w) => ZipWith a b c (Packed u) (Packed v) (Packed w) ZipWith a b c (a' :. u) (b' :. v) (c' :. w) => ZipWith a b c (a :. (a' :. u)) (b :. (b' :. v)) (c :. (c' :. w)) ZipWith a b c (a :. (a :. as)) (b :. ()) (c :. ()) ZipWith a b c (a :. ()) (b :. (b :. bs)) (c :. ()) ZipWith a b c (a :. ()) (b :. ()) (c :. ())
 class Fold a v | v -> a where Source
Fold a function over a vector.
Methods
 fold :: (a -> a -> a) -> v -> a Source
 foldl :: (b -> a -> b) -> b -> v -> b Source
 foldr :: (a -> b -> b) -> b -> v -> b Source
Instances
 (Fold a v, PackedVec v) => Fold a (Packed v) Fold a (a' :. u) => Fold a (a :. (a' :. u)) Fold a (a :. ())
 reverse :: Reverse' () v v' => v -> v' Source
Reverse a vector
 class Reverse' p v v' | p v -> v' where Source
Reverse helper function : accumulates the reversed list in its first argument
Methods
 reverse' :: p -> v -> v' Source
Instances
 Reverse' p () p (Reverse' () v v', PackedVec v, PackedVec v') => Reverse' () (Packed v) (Packed v') (Reverse' () v v', PackedVec v, PackedVec v') => Reverse' () (Packed v) (Packed v') Reverse' (a :. p) v v' => Reverse' p (a :. v) v'
 class Append v1 v2 v3 | v1 v2 -> v3, v1 v3 -> v2 where Source
Append two vectors
Methods
 append :: v1 -> v2 -> v3 Source
Instances
 Append () v v Append (a' :. v1) v2 v3 => Append (a :. (a' :. v1)) v2 (a :. v3) Append (a :. ()) v (a :. v)
 class Take n v v' | n v -> v' where Source
take n v constructs a vector from the first n elements of v. n is a type-level natural. For example take n3 v makes a 3-vector of the first three elements of v.
Methods
 take :: n -> v -> v' Source
Instances
 Take N0 v () Take N0 v () (Take (Succ n) v v', PackedVec v, PackedVec v') => Take (Succ n) (Packed v) (Packed v') (Take (Succ n) v v', PackedVec v, PackedVec v') => Take (Succ n) (Packed v) (Packed v') Take n v v' => Take (Succ n) (a :. v) (a :. v') Take n v v' => Take (Succ n) (a :. v) (a :. v')
 class Drop n v v' | n v -> v' where Source
drop n v strips the first n elements from v. n is a type-level natural. For example drop n2 v drops the first two elements.
Methods
 drop :: n -> v -> v' Source
Instances
 Drop N0 v v (Drop n v v', PackedVec v, PackedVec v') => Drop n (Packed v) (Packed v') Drop n (a :. v) v' => Drop (Succ n) (a :. (a :. v)) v' Drop n (a :. v) v' => Drop (Succ n) (a :. (a :. v)) v'
 class Last v a | v -> a where Source
Get the last element, usually significant for some reason (quaternions, homogenous coordinates, whatever)
Methods
 last :: v -> a Source
Instances
 (Last v l, PackedVec v) => Last (Packed v) l Last (a' :. v) a => Last (a :. (a' :. v)) a Last (a :. ()) a
 class Snoc v a v' | v a -> v', v' -> v a, v -> a where Source
snoc v a appends the element a to the end of v.
Methods
 snoc :: v -> a -> v' Source
Instances
 Snoc () a (a :. ()) Snoc () a (a :. ()) (Snoc v a v', PackedVec v, PackedVec v') => Snoc (Packed v) a (Packed v') Snoc v a (a :. v) => Snoc (a :. v) a (a :. (a :. v))
 class Length v n | v -> n where Source
The length of a vector
Methods
 length :: v -> Int Source
Instances
 Length () N0 Length () N0 (Length v n, PackedVec v) => Length (Packed v) n Length v n => Length (a :. v) (Succ n) Length v n => Length (a :. v) (Succ n)
 sum :: (Fold a v, Num a) => v -> a Source
sum of vector elements
 product :: (Fold a v, Num a) => v -> a Source
product of vector elements
 maximum :: (Fold a v, Ord a) => v -> a Source
maximum vector element
 minimum :: (Fold a v, Ord a) => v -> a Source
minimum vector element
 toList :: Fold a v => v -> [a] Source
Matrix Types
 type Mat22 a = Vec2 (Vec2 a) Source
 type Mat23 a = Vec2 (Vec3 a) Source
 type Mat24 a = Vec2 (Vec4 a) Source
 type Mat32 a = Vec3 (Vec2 a) Source
 type Mat33 a = Vec3 (Vec3 a) Source
 type Mat34 a = Vec3 (Vec4 a) Source
 type Mat35 a = Vec3 (Vec5 a) Source
 type Mat36 a = Vec3 (Vec6 a) Source
 type Mat42 a = Vec4 (Vec2 a) Source
 type Mat43 a = Vec4 (Vec3 a) Source
 type Mat44 a = Vec4 (Vec4 a) Source
 type Mat45 a = Vec4 (Vec5 a) Source
 type Mat46 a = Vec4 (Vec6 a) Source
 type Mat47 a = Vec4 (Vec7 a) Source
 type Mat48 a = Vec4 (Vec8 a) Source
 matToLists :: (Fold a v, Fold v m) => m -> [[a]] Source
convert a matrix to a list-of-lists
 matToList :: (Fold a v, Fold v m) => m -> [a] Source
convert a matrix to a list in row-major order
 matFromLists :: (Vec j a v, Vec i v m) => [[a]] -> m Source
convert a list-of-lists into a matrix
 matFromList :: forall i j v m a. (Vec i v m, Vec j a v, Nat i) => [a] -> m Source
convert a list into a matrix. (row-major order)