vector-sized-1.5.0: Size tagged vectors

Data.Vector.Generic.Sized

Description

This module reexports the functionality in Generic which maps well to explicity sized vectors.

Functions returning a vector determine the size from the type context unless they have a ' suffix in which case they take an explicit Proxy argument.

Functions where the resultant vector size is not know until compile time are not exported.

Synopsis

Documentation

data Vector v (n :: Nat) a where Source #

A wrapper to tag vectors with a type level length.

Be careful when using the constructor here to not construct sized vectors which have a different length than that specified in the type parameter!

Bundled Patterns

 pattern SomeSized :: Vector v a => forall n. KnownNat n => Vector v n a -> v a Pattern synonym that lets you treat an unsized vector as if it "contained" a sized vector. If you pattern match on an unsized vector, its contents will be the sized vector counterpart.testFunc :: Unsized.Vector Int -> Int testFunc (SomeSized v) = sum (zipWith (+) v (replicate 1)) -- ^ here, v is Sized.Vector n Int, and we have KnownNat n The n type variable will be properly instantiated to whatever the length of the vector is, and you will also have a KnownNat n instance available. You can get n in scope by turning on ScopedTypeVariables and matching on SomeSized (v :: Sized.Vector n Int).Without this, you would otherwise have to use withSized to do the same thing:testFunc :: Unsized.Vector Int -> Int testFunc u = withSized u $\v -> sum (zipWith (+) v (replicate 1)) Remember that the type of final result of your function (the Int, here) must not depend on n. However, the types of the intermediate values are allowed to depend on n.This is especially useful in do blocks, where you can pattern match on the unsized results of actions, to use the sized vector in the rest of the do block. You also get a KnownNat n constraint for the remainder of the do block.-- If you had: getAVector :: IO (Unsized.Vector Int) main :: IO () main = do SomeSized v <- getAVector -- v is Sized.Vector n Int print v -- alternatively, get n in scope SomeSized (v2 :: Sized.Vector n Int) <- getAVector print v2 Remember that the final type of the result of the do block ((), here) must not depend on n. However, theAlso useful in ghci, where you can pattern match to get sized vectors from unsized vectors.ghci> SomeSized v <- pure (myUnsizedVector :: Unsized.Vector Int) -- ^ v is Sized.Vector n Int This enables interactive exploration with sized vectors in ghci, and is useful for using with other libraries and functions that expect sized vectors in an interactive setting.(Note that as of GHC 8.6, you cannot get the n in scope in your ghci session using ScopedTypeVariables, like you can with do blocks)You can also use this as a constructor, to take a sized vector and "hide" the size, to produce an unsized vector:SomeSized :: Sized.Vector n a -> Unsized.Vector a Note that due to quirks in GHC pattern synonym completeness checking, you will get incomplete pattern matches if you use this polymorphically over different vector types, or you use any vector type other than the three supported by this library (normal, storable, unboxed). Instances Instances details  (Unbox a, KnownNat n) => Vector Vector (Vector Vector n a) Source # Instance detailsDefined in Data.Vector.Unboxed.Mutable.Sized MethodsbasicUnsafeFreeze :: PrimMonad m => Mutable Vector0 (PrimState m) (Vector Vector0 n a) -> m (Vector0 (Vector Vector0 n a)) #basicUnsafeThaw :: PrimMonad m => Vector0 (Vector Vector0 n a) -> m (Mutable Vector0 (PrimState m) (Vector Vector0 n a)) #basicLength :: Vector0 (Vector Vector0 n a) -> Int #basicUnsafeSlice :: Int -> Int -> Vector0 (Vector Vector0 n a) -> Vector0 (Vector Vector0 n a) #basicUnsafeIndexM :: Monad m => Vector0 (Vector Vector0 n a) -> Int -> m (Vector Vector0 n a) #basicUnsafeCopy :: PrimMonad m => Mutable Vector0 (PrimState m) (Vector Vector0 n a) -> Vector0 (Vector Vector0 n a) -> m () #elemseq :: Vector0 (Vector Vector0 n a) -> Vector Vector0 n a -> b -> b # (Unbox a, KnownNat n) => MVector MVector (Vector Vector n a) Source # Instance detailsDefined in Data.Vector.Unboxed.Mutable.Sized MethodsbasicLength :: MVector s (Vector Vector0 n a) -> Int #basicUnsafeSlice :: Int -> Int -> MVector s (Vector Vector0 n a) -> MVector s (Vector Vector0 n a) #basicOverlaps :: MVector s (Vector Vector0 n a) -> MVector s (Vector Vector0 n a) -> Bool #basicUnsafeNew :: PrimMonad m => Int -> m (MVector (PrimState m) (Vector Vector0 n a)) #basicInitialize :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> m () #basicUnsafeReplicate :: PrimMonad m => Int -> Vector Vector0 n a -> m (MVector (PrimState m) (Vector Vector0 n a)) #basicUnsafeRead :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> Int -> m (Vector Vector0 n a) #basicUnsafeWrite :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> Int -> Vector Vector0 n a -> m () #basicClear :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> m () #basicSet :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> Vector Vector0 n a -> m () #basicUnsafeCopy :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> MVector (PrimState m) (Vector Vector0 n a) -> m () #basicUnsafeMove :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> MVector (PrimState m) (Vector Vector0 n a) -> m () #basicUnsafeGrow :: PrimMonad m => MVector (PrimState m) (Vector Vector0 n a) -> Int -> m (MVector (PrimState m) (Vector Vector0 n a)) # KnownNat n => Monad (Vector Vector n) Source # Treats a Vector n a as, essentially, a Finite n -> a, and emulates the Monad instance for that function.join :: Vector n (Vector n a) -> Vector n a gets the diagonal from a square "matrix". Instance detailsDefined in Data.Vector.Generic.Sized Methods(>>=) :: Vector Vector0 n a -> (a -> Vector Vector0 n b) -> Vector Vector0 n b #(>>) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n b #return :: a -> Vector Vector0 n a # Functor v => Functor (Vector v n) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methodsfmap :: (a -> b) -> Vector v n a -> Vector v n b #(<$) :: a -> Vector v n b -> Vector v n a # Source # The Applicative instance for sized vectors does not have the same behaviour as the Applicative instance for the unsized vectors found in the vectors package. The instance defined here has the same behaviour as the ZipList instance. Instance detailsDefined in Data.Vector.Generic.Sized Methodspure :: a -> Vector Vector0 n a #(<*>) :: Vector Vector0 n (a -> b) -> Vector Vector0 n a -> Vector Vector0 n b #liftA2 :: (a -> b -> c) -> Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n c #(*>) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n b #(<*) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n a # Foldable v => Foldable (Vector v n) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methodsfold :: Monoid m => Vector v n m -> m #foldMap :: Monoid m => (a -> m) -> Vector v n a -> m #foldMap' :: Monoid m => (a -> m) -> Vector v n a -> m #foldr :: (a -> b -> b) -> b -> Vector v n a -> b #foldr' :: (a -> b -> b) -> b -> Vector v n a -> b #foldl :: (b -> a -> b) -> b -> Vector v n a -> b #foldl' :: (b -> a -> b) -> b -> Vector v n a -> b #foldr1 :: (a -> a -> a) -> Vector v n a -> a #foldl1 :: (a -> a -> a) -> Vector v n a -> a #toList :: Vector v n a -> [a] #null :: Vector v n a -> Bool #length :: Vector v n a -> Int #elem :: Eq a => a -> Vector v n a -> Bool #maximum :: Ord a => Vector v n a -> a #minimum :: Ord a => Vector v n a -> a #sum :: Num a => Vector v n a -> a #product :: Num a => Vector v n a -> a # Traversable v => Traversable (Vector v n) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methodstraverse :: Applicative f => (a -> f b) -> Vector v n a -> f (Vector v n b) #sequenceA :: Applicative f => Vector v n (f a) -> f (Vector v n a) #mapM :: Monad m => (a -> m b) -> Vector v n a -> m (Vector v n b) #sequence :: Monad m => Vector v n (m a) -> m (Vector v n a) # Source # Instance detailsDefined in Data.Vector.Generic.Sized Methodsdistribute :: Functor f => f (Vector Vector0 n a) -> Vector Vector0 n (f a) #collect :: Functor f => (a -> Vector Vector0 n b) -> f a -> Vector Vector0 n (f b) #distributeM :: Monad m => m (Vector Vector0 n a) -> Vector Vector0 n (m a) #collectM :: Monad m => (a -> Vector Vector0 n b) -> m a -> Vector Vector0 n (m b) # Source # Instance detailsDefined in Data.Vector.Generic.Sized Associated Typestype Rep (Vector Vector n) # Methodstabulate :: (Rep (Vector Vector0 n) -> a) -> Vector Vector0 n a #index :: Vector Vector0 n a -> Rep (Vector Vector0 n) -> a # Eq1 v => Eq1 (Vector v n) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal MethodsliftEq :: (a -> b -> Bool) -> Vector v n a -> Vector v n b -> Bool # Ord1 v => Ord1 (Vector v n) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal MethodsliftCompare :: (a -> b -> Ordering) -> Vector v n a -> Vector v n b -> Ordering # Show1 v => Show1 (Vector v n) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal MethodsliftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Vector v n a -> ShowS #liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [Vector v n a] -> ShowS # (KnownNat n, n ~ (1 + m)) => Comonad (Vector Vector n) Source # Non-empty sized vectors are lawful comonads.extract is headduplicate generates all unique sequences of a vector with the same length as it, using wrap-around.e.g.  duplicate [1,2,3,4,5] = [[1,2,3,4,5], [2,3,4,5,1], [3,4,5,1,2], [4,5,1,2,3], [5,1,2,3,4]]  Instance detailsDefined in Data.Vector.Generic.Sized Methodsextract :: Vector Vector0 n a -> a #duplicate :: Vector Vector0 n a -> Vector Vector0 n (Vector Vector0 n a) #extend :: (Vector Vector0 n a -> b) -> Vector Vector0 n a -> Vector Vector0 n b # (KnownNat n, n ~ (1 + m)) => ComonadApply (Vector Vector n) Source # Instance detailsDefined in Data.Vector.Generic.Sized Methods(<@>) :: Vector Vector0 n (a -> b) -> Vector Vector0 n a -> Vector Vector0 n b #(@>) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n b #(<@) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n a # Eq (v a) => Eq (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methods(==) :: Vector v n a -> Vector v n a -> Bool #(/=) :: Vector v n a -> Vector v n a -> Bool # (Vector v a, Floating a, KnownNat n) => Floating (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized Methodspi :: Vector v n a #exp :: Vector v n a -> Vector v n a #log :: Vector v n a -> Vector v n a #sqrt :: Vector v n a -> Vector v n a #(**) :: Vector v n a -> Vector v n a -> Vector v n a #logBase :: Vector v n a -> Vector v n a -> Vector v n a #sin :: Vector v n a -> Vector v n a #cos :: Vector v n a -> Vector v n a #tan :: Vector v n a -> Vector v n a #asin :: Vector v n a -> Vector v n a #acos :: Vector v n a -> Vector v n a #atan :: Vector v n a -> Vector v n a #sinh :: Vector v n a -> Vector v n a #cosh :: Vector v n a -> Vector v n a #tanh :: Vector v n a -> Vector v n a #asinh :: Vector v n a -> Vector v n a #acosh :: Vector v n a -> Vector v n a #atanh :: Vector v n a -> Vector v n a #log1p :: Vector v n a -> Vector v n a #expm1 :: Vector v n a -> Vector v n a #log1pexp :: Vector v n a -> Vector v n a #log1mexp :: Vector v n a -> Vector v n a # (Vector v a, Fractional a, KnownNat n) => Fractional (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized Methods(/) :: Vector v n a -> Vector v n a -> Vector v n a #recip :: Vector v n a -> Vector v n a #fromRational :: Rational -> Vector v n a # (KnownNat n, Typeable v, Typeable a, Data (v a)) => Data (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Vector v n a -> c (Vector v n a) #gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Vector v n a) #toConstr :: Vector v n a -> Constr #dataTypeOf :: Vector v n a -> DataType #dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Vector v n a)) #dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Vector v n a)) #gmapT :: (forall b. Data b => b -> b) -> Vector v n a -> Vector v n a #gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Vector v n a -> r #gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Vector v n a -> r #gmapQ :: (forall d. Data d => d -> u) -> Vector v n a -> [u] #gmapQi :: Int -> (forall d. Data d => d -> u) -> Vector v n a -> u #gmapM :: Monad m => (forall d. Data d => d -> m d) -> Vector v n a -> m (Vector v n a) #gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Vector v n a -> m (Vector v n a) #gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Vector v n a -> m (Vector v n a) # (Vector v a, Num a, KnownNat n) => Num (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized Methods(+) :: Vector v n a -> Vector v n a -> Vector v n a #(-) :: Vector v n a -> Vector v n a -> Vector v n a #(*) :: Vector v n a -> Vector v n a -> Vector v n a #negate :: Vector v n a -> Vector v n a #abs :: Vector v n a -> Vector v n a #signum :: Vector v n a -> Vector v n a #fromInteger :: Integer -> Vector v n a # Ord (v a) => Ord (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methodscompare :: Vector v n a -> Vector v n a -> Ordering #(<) :: Vector v n a -> Vector v n a -> Bool #(<=) :: Vector v n a -> Vector v n a -> Bool #(>) :: Vector v n a -> Vector v n a -> Bool #(>=) :: Vector v n a -> Vector v n a -> Bool #max :: Vector v n a -> Vector v n a -> Vector v n a #min :: Vector v n a -> Vector v n a -> Vector v n a # (KnownNat n, Vector v a, Read (v a)) => Read (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized MethodsreadsPrec :: Int -> ReadS (Vector v n a) #readList :: ReadS [Vector v n a] #readPrec :: ReadPrec (Vector v n a) #readListPrec :: ReadPrec [Vector v n a] # Show (v a) => Show (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal MethodsshowsPrec :: Int -> Vector v n a -> ShowS #show :: Vector v n a -> String #showList :: [Vector v n a] -> ShowS # (Ix a, Ord (v a), Vector v a) => Ix (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methodsrange :: (Vector v n a, Vector v n a) -> [Vector v n a] #index :: (Vector v n a, Vector v n a) -> Vector v n a -> Int #unsafeIndex :: (Vector v n a, Vector v n a) -> Vector v n a -> Int #inRange :: (Vector v n a, Vector v n a) -> Vector v n a -> Bool #rangeSize :: (Vector v n a, Vector v n a) -> Int #unsafeRangeSize :: (Vector v n a, Vector v n a) -> Int # (Semigroup g, Vector v g) => Semigroup (Vector v n g) Source # The Semigroup instance for sized vectors does not have the same behaviour as the Semigroup instance for the unsized vectors found in the vectors package. This instance has (<>) = zipWith (<>), but vectors uses concatentation. Instance detailsDefined in Data.Vector.Generic.Sized Methods(<>) :: Vector v n g -> Vector v n g -> Vector v n g #sconcat :: NonEmpty (Vector v n g) -> Vector v n g #stimes :: Integral b => b -> Vector v n g -> Vector v n g # (Monoid m, Vector v m, KnownNat n) => Monoid (Vector v n m) Source # The Monoid instance for sized vectors does not have the same behaviour as the Monoid instance for the unsized vectors found in the vectors package. This instance has mempty = replicate mempty and mappend = zipWith mappend, where the vectors instance uses the empty vector and concatenation.If mempty is not necessary, using the Semigroup instance over this Monoid will dodge the KnownNat constraint. Instance detailsDefined in Data.Vector.Generic.Sized Methodsmempty :: Vector v n m #mappend :: Vector v n m -> Vector v n m -> Vector v n m #mconcat :: [Vector v n m] -> Vector v n m # (KnownNat n, Storable a, Vector v a) => Storable (Vector v n a) Source # Any sized vector containing Storable elements is itself Storable. Instance detailsDefined in Data.Vector.Generic.Sized MethodssizeOf :: Vector v n a -> Int #alignment :: Vector v n a -> Int #peekElemOff :: Ptr (Vector v n a) -> Int -> IO (Vector v n a) #pokeElemOff :: Ptr (Vector v n a) -> Int -> Vector v n a -> IO () #peekByteOff :: Ptr b -> Int -> IO (Vector v n a) #pokeByteOff :: Ptr b -> Int -> Vector v n a -> IO () #peek :: Ptr (Vector v n a) -> IO (Vector v n a) #poke :: Ptr (Vector v n a) -> Vector v n a -> IO () # (Vector v a, Bits (v a), Bits a, KnownNat n) => Bits (Vector v n a) Source # Only usable if v a is itself an instance of Bits, like in the case with the bitvec library Bit type for unboxed vectors. Instance detailsDefined in Data.Vector.Generic.Sized Methods(.&.) :: Vector v n a -> Vector v n a -> Vector v n a #(.|.) :: Vector v n a -> Vector v n a -> Vector v n a #xor :: Vector v n a -> Vector v n a -> Vector v n a #complement :: Vector v n a -> Vector v n a #shift :: Vector v n a -> Int -> Vector v n a #rotate :: Vector v n a -> Int -> Vector v n a #zeroBits :: Vector v n a #bit :: Int -> Vector v n a #setBit :: Vector v n a -> Int -> Vector v n a #clearBit :: Vector v n a -> Int -> Vector v n a #complementBit :: Vector v n a -> Int -> Vector v n a #testBit :: Vector v n a -> Int -> Bool #bitSizeMaybe :: Vector v n a -> Maybe Int #bitSize :: Vector v n a -> Int #isSigned :: Vector v n a -> Bool #shiftL :: Vector v n a -> Int -> Vector v n a #unsafeShiftL :: Vector v n a -> Int -> Vector v n a #shiftR :: Vector v n a -> Int -> Vector v n a #unsafeShiftR :: Vector v n a -> Int -> Vector v n a #rotateL :: Vector v n a -> Int -> Vector v n a #rotateR :: Vector v n a -> Int -> Vector v n a #popCount :: Vector v n a -> Int # (Vector v a, Bits (v a), FiniteBits a, KnownNat n) => FiniteBits (Vector v n a) Source # Treats a bit vector as n times the size of the stored bits, reflecting the Bits instance; does not necessarily reflect exact in-memory representation. See Storable instance to get information on the actual in-memry representation. Instance detailsDefined in Data.Vector.Generic.Sized MethodsfiniteBitSize :: Vector v n a -> Int #countLeadingZeros :: Vector v n a -> Int #countTrailingZeros :: Vector v n a -> Int # (Vector v a, Binary a, KnownNat n) => Binary (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized Methodsput :: Vector v n a -> Put #get :: Get (Vector v n a) #putList :: [Vector v n a] -> Put # NFData (v a) => NFData (Vector v n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized.Internal Methodsrnf :: Vector v n a -> () # (Eq a, Hashable a, Unbox a) => Hashable (Vector Vector n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized MethodshashWithSalt :: Int -> Vector Vector0 n a -> Int #hash :: Vector Vector0 n a -> Int # (Eq a, Hashable a, Storable a) => Hashable (Vector Vector n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized MethodshashWithSalt :: Int -> Vector Vector0 n a -> Int #hash :: Vector Vector0 n a -> Int # (Eq a, Hashable a) => Hashable (Vector Vector n a) Source # Instance detailsDefined in Data.Vector.Generic.Sized MethodshashWithSalt :: Int -> Vector Vector0 n a -> Int #hash :: Vector Vector0 n a -> Int # (Unbox a, KnownNat n) => Unbox (Vector Vector n a) Source # This instance allows to define sized matrices and tensors backed by continuous memory segments, which reduces memory allocations and relaxes pressure on garbage collector. Instance detailsDefined in Data.Vector.Unboxed.Mutable.Sized newtype MVector s (Vector Vector n a) Source # Instance detailsDefined in Data.Vector.Unboxed.Mutable.Sized newtype MVector s (Vector Vector n a) = MV_Sized (MVector s a) type Rep (Vector Vector n) Source # Instance detailsDefined in Data.Vector.Generic.Sized type Rep (Vector Vector n) = Finite n type Mutable (Vector v n) Source # Instance detailsDefined in Data.Vector.Generic.Sized type Mutable (Vector v n) = MVector (Mutable v) n newtype Vector (Vector Vector n a) Source # Instance detailsDefined in Data.Vector.Unboxed.Mutable.Sized newtype Vector (Vector Vector n a) = V_Sized (Vector a)

data MVector v (n :: Nat) s a Source #

A wrapper to tag mutable vectors with a type level length.

Be careful when using the constructor here to not construct sized vectors which have a different length than that specified in the type parameter!

Instances

Instances details
 (KnownNat n, Typeable v, Typeable s, Typeable a, Data (v s a)) => Data (MVector v n s a) Source # Instance details Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> MVector v n s a -> c (MVector v n s a) #gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (MVector v n s a) #toConstr :: MVector v n s a -> Constr #dataTypeOf :: MVector v n s a -> DataType #dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (MVector v n s a)) #dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (MVector v n s a)) #gmapT :: (forall b. Data b => b -> b) -> MVector v n s a -> MVector v n s a #gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> MVector v n s a -> r #gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> MVector v n s a -> r #gmapQ :: (forall d. Data d => d -> u) -> MVector v n s a -> [u] #gmapQi :: Int -> (forall d. Data d => d -> u) -> MVector v n s a -> u #gmapM :: Monad m => (forall d. Data d => d -> m d) -> MVector v n s a -> m (MVector v n s a) #gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> MVector v n s a -> m (MVector v n s a) #gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> MVector v n s a -> m (MVector v n s a) # Storable (v s a) => Storable (MVector v n s a) Source # Instance details MethodssizeOf :: MVector v n s a -> Int #alignment :: MVector v n s a -> Int #peekElemOff :: Ptr (MVector v n s a) -> Int -> IO (MVector v n s a) #pokeElemOff :: Ptr (MVector v n s a) -> Int -> MVector v n s a -> IO () #peekByteOff :: Ptr b -> Int -> IO (MVector v n s a) #pokeByteOff :: Ptr b -> Int -> MVector v n s a -> IO () #peek :: Ptr (MVector v n s a) -> IO (MVector v n s a) #poke :: Ptr (MVector v n s a) -> MVector v n s a -> IO () # NFData (v s a) => NFData (MVector v n s a) Source # Instance details Methodsrnf :: MVector v n s a -> () #

Accessors

Length information

length :: forall v n a. KnownNat n => Vector v n a -> Int Source #

O(1) Yield the length of the vector as an Int. This is more like natVal than length, extracting the value from the KnownNat instance and not looking at the vector itself.

length' :: forall v n a. Vector v n a -> Proxy n Source #

O(1) Yield the length of the vector as a Proxy. This function doesn't do anything; it merely allows the size parameter of the vector to be passed around as a Proxy.

Arguments

 :: forall v n a r. Vector v a => Vector v n a a vector of some (potentially unknown) length -> (KnownNat n => r) a value that depends on knowing the vector's length -> r the value computed with the length

O(1) Reveal a KnownNat instance for a vector's length, determined at runtime.

Arguments

 :: forall v n a r. Vector v a => Vector v n a a vector of some (potentially unknown) length -> (KnownNat n => Proxy n -> r) a value that depends on knowing the vector's length, which is given as a Proxy -> r the value computed with the length

O(1) Reveal a KnownNat instance and Proxy for a vector's length, determined at runtime.

Indexing

index :: forall v n a. Vector v a => Vector v n a -> Finite n -> a Source #

O(1) Safe indexing using a Finite.

index' :: forall v n m a p. (KnownNat n, Vector v a) => Vector v ((n + m) + 1) a -> p n -> a Source #

O(1) Safe indexing using a Proxy.

unsafeIndex :: forall v n a. Vector v a => Vector v n a -> Int -> a Source #

O(1) Indexing using an Int without bounds checking.

head :: forall v n a. Vector v a => Vector v (1 + n) a -> a Source #

O(1) Yield the first element of a non-empty vector.

last :: forall v n a. Vector v a => Vector v (n + 1) a -> a Source #

O(1) Yield the last element of a non-empty vector.

indexM :: forall v n a m. (Vector v a, Monad m) => Vector v n a -> Finite n -> m a Source #

O(1) Safe indexing in a monad.

The monad allows operations to be strict in the vector when necessary. Suppose vector copying is implemented like this:

copy mv v = ... write mv i (v ! i) ...


For lazy vectors, v ! i would not be evaluated, which means that mv would unnecessarily retain a reference to v in each element when written.

With indexM, copying can be implemented like this instead:

copy mv v = ... do
x <- indexM v i
write mv i x


Here, no references to v are retained, because indexing (but not the elements) are evaluated eagerly.

indexM' :: forall v n k a m p. (KnownNat n, Vector v a, Monad m) => Vector v (n + k) a -> p n -> m a Source #

O(1) Safe indexing in a monad using a Proxy. See the documentation for indexM for an explanation of why this is useful.

unsafeIndexM :: forall v n a m. (Vector v a, Monad m) => Vector v n a -> Int -> m a Source #

O(1) Indexing using an Int without bounds checking. See the documentation for indexM for an explanation of why this is useful.

headM :: forall v n a m. (Vector v a, Monad m) => Vector v (1 + n) a -> m a Source #

O(1) Yield the first element of a non-empty vector in a monad. See the documentation for indexM for an explanation of why this is useful.

lastM :: forall v n a m. (Vector v a, Monad m) => Vector v (n + 1) a -> m a Source #

O(1) Yield the last element of a non-empty vector in a monad. See the documentation for indexM for an explanation of why this is useful.

Extracting subvectors (slicing)

Arguments

 :: forall v i n m a p. (KnownNat i, KnownNat n, Vector v a) => p i starting index -> Vector v ((i + n) + m) a -> Vector v n a

O(1) Yield a slice of the vector without copying it with an inferred length argument.

Arguments

 :: forall v i n m a p. (KnownNat i, KnownNat n, Vector v a) => p i starting index -> p n length -> Vector v ((i + n) + m) a -> Vector v n a

O(1) Yield a slice of the vector without copying it with an explicit length argument.

init :: forall v n a. Vector v a => Vector v (n + 1) a -> Vector v n a Source #

O(1) Yield all but the last element of a non-empty vector without copying.

tail :: forall v n a. Vector v a => Vector v (1 + n) a -> Vector v n a Source #

O(1) Yield all but the first element of a non-empty vector without copying.

take :: forall v n m a. (KnownNat n, Vector v a) => Vector v (n + m) a -> Vector v n a Source #

O(1) Yield the first n elements. The resulting vector always contains this many elements. The length of the resulting vector is inferred from the type.

take' :: forall v n m a p. (KnownNat n, Vector v a) => p n -> Vector v (n + m) a -> Vector v n a Source #

O(1) Yield the first n elements. The resulting vector always contains this many elements. The length of the resulting vector is given explicitly as a Proxy argument.

drop :: forall v n m a. (KnownNat n, Vector v a) => Vector v (n + m) a -> Vector v m a Source #

O(1) Yield all but the the first n elements. The given vector must contain at least this many elements. The length of the resulting vector is inferred from the type.

drop' :: forall v n m a p. (KnownNat n, Vector v a) => p n -> Vector v (n + m) a -> Vector v m a Source #

O(1) Yield all but the the first n elements. The given vector must contain at least this many elements. The length of the resulting vector is givel explicitly as a Proxy argument.

splitAt :: forall v n m a. (KnownNat n, Vector v a) => Vector v (n + m) a -> (Vector v n a, Vector v m a) Source #

O(1) Yield the first n elements, paired with the rest, without copying. The lengths of the resulting vectors are inferred from the type.

splitAt' :: forall v n m a p. (KnownNat n, Vector v a) => p n -> Vector v (n + m) a -> (Vector v n a, Vector v m a) Source #

O(1) Yield the first n elements, paired with the rest, without copying. The length of the first resulting vector is passed explicitly as a Proxy argument.

Construction

Initialization

empty :: forall v a. Vector v a => Vector v 0 a Source #

O(1) Empty vector.

singleton :: forall v a. Vector v a => a -> Vector v 1 a Source #

O(1) Vector with exactly one element.

fromTuple :: forall v a input length. (Vector v a, IndexedListLiterals input length a, KnownNat length) => input -> Vector v length a Source #

O(n) Construct a vector in a type-safe manner.  fromTuple (1,2) :: Vector v 2 Int fromTuple ("hey", "what's", "going", "on") :: Vector v 4 String 

replicate :: forall v n a. (KnownNat n, Vector v a) => a -> Vector v n a Source #

O(n) Construct a vector with the same element in each position where the length is inferred from the type.

replicate' :: forall v n a p. (KnownNat n, Vector v a) => p n -> a -> Vector v n a Source #

O(n) Construct a vector with the same element in each position where the length is given explicitly as a Proxy argument.

generate :: forall v n a. (KnownNat n, Vector v a) => (Finite n -> a) -> Vector v n a Source #

O(n) Construct a vector of the given length by applying the function to each index where the length is inferred from the type.

generate' :: forall v n a p. (KnownNat n, Vector v a) => p n -> (Finite n -> a) -> Vector v n a Source #

O(n) Construct a vector of the given length by applying the function to each index where the length is given explicitly as a Proxy argument.

iterateN :: forall v n a. (KnownNat n, Vector v a) => (a -> a) -> a -> Vector v n a Source #

O(n) Apply the function n times to a value. Zeroth element is the original value. The length is inferred from the type.

iterateN' :: forall v n a p. (KnownNat n, Vector v a) => p n -> (a -> a) -> a -> Vector v n a Source #

O(n) Apply the function n times to a value. Zeroth element is the original value. The length is given explicitly as a Proxy argument.

replicateM :: forall v n m a. (KnownNat n, Vector v a, Monad m) => m a -> m (Vector v n a) Source #

O(n) Execute the monadic action n times and store the results in a vector where n is inferred from the type.

replicateM' :: forall v n m a p. (KnownNat n, Vector v a, Monad m) => p n -> m a -> m (Vector v n a) Source #

O(n) Execute the monadic action n times and store the results in a vector where n is given explicitly as a Proxy argument.

generateM :: forall v n m a. (KnownNat n, Vector v a, Monad m) => (Finite n -> m a) -> m (Vector v n a) Source #

O(n) Construct a vector of length n by applying the monadic action to each index where n is inferred from the type.

generateM' :: forall v n m a p. (KnownNat n, Vector v a, Monad m) => p n -> (Finite n -> m a) -> m (Vector v n a) Source #

O(n) Construct a vector of length n by applying the monadic action to each index where n is given explicitly as a Proxy argument.

Unfolding

unfoldrN :: forall v n a b. (KnownNat n, Vector v a) => (b -> (a, b)) -> b -> Vector v n a Source #

O(n) Construct a vector with exactly n elements by repeatedly applying the generator function to the a seed. The length is inferred from the type.

unfoldrN' :: forall v n a b p. (KnownNat n, Vector v a) => p n -> (b -> (a, b)) -> b -> Vector v n a Source #

O(n) Construct a vector with exactly n elements by repeatedly applying the generator function to the a seed. The length is given explicitly as a Proxy argument.

Enumeration

enumFromN :: forall v n a. (KnownNat n, Vector v a, Num a) => a -> Vector v n a Source #

O(n) Yield a vector of length n containing the values x, x+1, ... x + (n - 1). The length is inferred from the type.

enumFromN' :: forall v n a p. (KnownNat n, Vector v a, Num a) => a -> p n -> Vector v n a Source #

O(n) Yield a vector of length n containing the values x, x+1, ..., x + (n - 1) The length is given explicitly as a Proxy argument.

enumFromStepN :: forall v n a. (KnownNat n, Vector v a, Num a) => a -> a -> Vector v n a Source #

O(n) Yield a vector of the given length containing the values x, x+y, x+2y, ... x + (n - 1)y. The length is inferred from the type.

enumFromStepN' :: forall v n a p. (KnownNat n, Vector v a, Num a) => a -> a -> p n -> Vector v n a Source #

O(n) Yield a vector of the given length containing the values x, x+y, x+2y, ..., x + (n - 1)y. The length is given explicitly as a Proxy argument.

Concatenation

cons :: forall v n a. Vector v a => a -> Vector v n a -> Vector v (1 + n) a Source #

O(n) Prepend an element.

snoc :: forall v n a. Vector v a => Vector v n a -> a -> Vector v (n + 1) a Source #

O(n) Append an element.

(++) :: forall v n m a. Vector v a => Vector v n a -> Vector v m a -> Vector v (n + m) a Source #

O(m+n) Concatenate two vectors.

Restricting memory usage

force :: Vector v a => Vector v n a -> Vector v n a Source #

O(n) Yield the argument but force it not to retain any extra memory, possibly by copying it.

This is especially useful when dealing with slices. For example:

force (slice 0 2 <huge vector>)

Here, the slice retains a reference to the huge vector. Forcing it creates a copy of just the elements that belong to the slice and allows the huge vector to be garbage collected.

Modifying vectors

Arguments

 :: Vector v a => Vector v m a initial vector (of length m) -> [(Finite m, a)] list of index/value pairs (of length n) -> Vector v m a

O(m+n) For each pair (i,a) from the list, replace the vector element at position i by a.

<5,9,2,7> // [(2,1),(0,3),(2,8)] = <3,9,8,7>

Arguments

 :: (Vector v a, Vector v (Int, a)) => Vector v m a initial vector (of length m) -> Vector v n (Int, a) vector of index/value pairs (of length n) -> Vector v m a

O(m+n) For each pair (i,a) from the vector of index/value pairs, replace the vector element at position i by a.

update <5,9,2,7> <(2,1),(0,3),(2,8)> = <3,9,8,7>

Arguments

 :: (Vector v a, Vector v Int) => Vector v m a initial vector (of length m) -> Vector v n Int index vector (of length n) -> Vector v n a value vector (of length n) -> Vector v m a

O(m+n) For each index i from the index vector and the corresponding value a from the value vector, replace the element of the initial vector at position i by a.

update_ <5,9,2,7>  <2,0,2> <1,3,8> = <3,9,8,7>

This function is useful for instances of Vector that cannot store pairs. Otherwise, update is probably more convenient.

update_ xs is ys = update xs (zip is ys)


Arguments

 :: Vector v a => Vector v m a initial vector (of length m) -> [(Int, a)] list of index/value pairs (of length n) -> Vector v m a

Same as (//) but without bounds checking.

Arguments

 :: (Vector v a, Vector v (Int, a)) => Vector v m a initial vector (of length m) -> Vector v n (Int, a) vector of index/value pairs (of length n) -> Vector v m a

Same as update but without bounds checking.

Arguments

 :: (Vector v a, Vector v Int) => Vector v m a initial vector (of length m) -> Vector v n Int index vector (of length n) -> Vector v n a value vector (of length n) -> Vector v m a

Same as update_ but without bounds checking.

Accumulations

Arguments

 :: Vector v a => (a -> b -> a) accumulating function f -> Vector v m a initial vector (of length m) -> [(Finite m, b)] list of index/value pairs (of length n) -> Vector v m a

O(m+n) For each pair (i,b) from the list, replace the vector element a at position i by f a b.

accum (+) <5,9,2> [(2,4),(1,6),(0,3),(1,7)] = <5+3, 9+6+7, 2+4>

Arguments

 :: (Vector v a, Vector v (Int, b)) => (a -> b -> a) accumulating function f -> Vector v m a initial vector (of length m) -> Vector v n (Int, b) vector of index/value pairs (of length n) -> Vector v m a

O(m+n) For each pair (i,b) from the vector of pairs, replace the vector element a at position i by f a b.

accumulate (+) <5,9,2> <(2,4),(1,6),(0,3),(1,7)> = <5+3, 9+6+7, 2+4>

Arguments

 :: (Vector v a, Vector v Int, Vector v b) => (a -> b -> a) accumulating function f -> Vector v m a initial vector (of length m) -> Vector v n Int index vector (of length n) -> Vector v n b value vector (of length n) -> Vector v m a

O(m+n) For each index i from the index vector and the corresponding value b from the the value vector, replace the element of the initial vector at position i by f a b.

accumulate_ (+) <5,9,2> <2,1,0,1> <4,6,3,7> = <5+3, 9+6+7, 2+4>

This function is useful for instances of Vector that cannot store pairs. Otherwise, accumulate is probably more convenient:

accumulate_ f as is bs = accumulate f as (zip is bs)


Arguments

 :: Vector v a => (a -> b -> a) accumulating function f -> Vector v m a initial vector (of length m) -> [(Int, b)] list of index/value pairs (of length n) -> Vector v m a

Same as accum but without bounds checking.

Arguments

 :: (Vector v a, Vector v (Int, b)) => (a -> b -> a) accumulating function f -> Vector v m a initial vector (of length m) -> Vector v n (Int, b) vector of index/value pairs (of length n) -> Vector v m a

Same as accumulate but without bounds checking.

Arguments

 :: (Vector v a, Vector v Int, Vector v b) => (a -> b -> a) accumulating function f -> Vector v m a initial vector (of length m) -> Vector v n Int index vector (of length n) -> Vector v n b value vector (of length n) -> Vector v m a

Same as accumulate_ but without bounds checking.

Permutations

reverse :: Vector v a => Vector v n a -> Vector v n a Source #

O(n) Reverse a vector

Arguments

 :: (Vector v a, Vector v Int) => Vector v m a xs value vector -> Vector v n Int is index vector (of length n) -> Vector v n a

O(n) Yield the vector obtained by replacing each element i of the index vector by xs!i. This is equivalent to map (xs!) is but is often much more efficient.

backpermute <a,b,c,d> <0,3,2,3,1,0> = <a,d,c,d,b,a>

Arguments

 :: (Vector v a, Vector v Int) => Vector v m a xs value vector -> Vector v n Int is index vector (of length n) -> Vector v n a

Same as backpermute but without bounds checking.

Lenses

ix :: forall v n a f. (Vector v a, Functor f) => Finite n -> (a -> f a) -> Vector v n a -> f (Vector v n a) Source #

Lens to access (O(1)) and update (O(n)) an arbitrary element by its index.

ix' :: forall i v n a f. (Vector v a, Functor f, KnownNat i, KnownNat n, (i + 1) <= n) => (a -> f a) -> Vector v n a -> f (Vector v n a) Source #

Type-safe lens to access (O(1)) and update (O(n)) an arbitrary element by its index which should be supplied via TypeApplications.

_head :: forall v n a f. (Vector v a, Functor f) => (a -> f a) -> Vector v (1 + n) a -> f (Vector v (1 + n) a) Source #

Lens to access (O(1)) and update (O(n)) the first element of a non-empty vector.

_last :: forall v n a f. (Vector v a, Functor f) => (a -> f a) -> Vector v (n + 1) a -> f (Vector v (n + 1) a) Source #

Lens to access (O(1)) and update (O(n)) the last element of a non-empty vector.

Elementwise operations

Indexing

indexed :: (Vector v a, Vector v (Int, a), Vector v (Finite n, a)) => Vector v n a -> Vector v n (Finite n, a) Source #

O(n) Pair each element in a vector with its index.

Mapping

map :: (Vector v a, Vector v b) => (a -> b) -> Vector v n a -> Vector v n b Source #

O(n) Map a function over a vector.

imap :: (Vector v a, Vector v b) => (Finite n -> a -> b) -> Vector v n a -> Vector v n b Source #

O(n) Apply a function to every element of a vector and its index.

concatMap :: (Vector v a, Vector v' b) => (a -> Vector v' m b) -> Vector v n a -> Vector v' (n * m) b Source #

O(n*m) Map a function over a vector and concatenate the results. The function is required to always return a vector of the same length.

mapM :: (Monad m, Vector v a, Vector v b) => (a -> m b) -> Vector v n a -> m (Vector v n b) Source #

O(n) Apply the monadic action to all elements of the vector, yielding a vector of results.

imapM :: (Monad m, Vector v a, Vector v b) => (Finite n -> a -> m b) -> Vector v n a -> m (Vector v n b) Source #

O(n) Apply the monadic action to every element of a vector and its index, yielding a vector of results.

mapM_ :: (Monad m, Vector v a) => (a -> m b) -> Vector v n a -> m () Source #

O(n) Apply the monadic action to all elements of a vector and ignore the results.

imapM_ :: (Monad m, Vector v a) => (Finite n -> a -> m b) -> Vector v n a -> m () Source #

O(n) Apply the monadic action to every element of a vector and its index, ignoring the results.

forM :: (Monad m, Vector v a, Vector v b) => Vector v n a -> (a -> m b) -> m (Vector v n b) Source #

O(n) Apply the monadic action to all elements of the vector, yielding a vector of results. Equvalent to flip mapM.

forM_ :: (Monad m, Vector v a) => Vector v n a -> (a -> m b) -> m () Source #

O(n) Apply the monadic action to all elements of a vector and ignore the results. Equivalent to flip mapM_.

Zipping

zipWith :: (Vector v a, Vector v b, Vector v c) => (a -> b -> c) -> Vector v n a -> Vector v n b -> Vector v n c Source #

O(n) Zip two vectors of the same length with the given function.

zipWith3 :: (Vector v a, Vector v b, Vector v c, Vector v d) => (a -> b -> c -> d) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d Source #

Zip three vectors with the given function.

zipWith4 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e) => (a -> b -> c -> d -> e) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e Source #

zipWith5 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v f) => (a -> b -> c -> d -> e -> f) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e -> Vector v n f Source #

zipWith6 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v f, Vector v g) => (a -> b -> c -> d -> e -> f -> g) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e -> Vector v n f -> Vector v n g Source #

izipWith :: (Vector v a, Vector v b, Vector v c) => (Finite n -> a -> b -> c) -> Vector v n a -> Vector v n b -> Vector v n c Source #

O(n) Zip two vectors of the same length with a function that also takes the elements' indices).

izipWith3 :: (Vector v a, Vector v b, Vector v c, Vector v d) => (Finite n -> a -> b -> c -> d) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d Source #

izipWith4 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e) => (Finite n -> a -> b -> c -> d -> e) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e Source #

izipWith5 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v f) => (Finite n -> a -> b -> c -> d -> e -> f) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e -> Vector v n f Source #

izipWith6 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v f, Vector v g) => (Finite n -> a -> b -> c -> d -> e -> f -> g) -> Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e -> Vector v n f -> Vector v n g Source #

zip :: (Vector v a, Vector v b, Vector v (a, b)) => Vector v n a -> Vector v n b -> Vector v n (a, b) Source #

O(n) Zip two vectors of the same length

zip3 :: (Vector v a, Vector v b, Vector v c, Vector v (a, b, c)) => Vector v n a -> Vector v n b -> Vector v n c -> Vector v n (a, b, c) Source #

zip4 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v (a, b, c, d)) => Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n (a, b, c, d) Source #

zip5 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v (a, b, c, d, e)) => Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e -> Vector v n (a, b, c, d, e) Source #

zip6 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v f, Vector v (a, b, c, d, e, f)) => Vector v n a -> Vector v n b -> Vector v n c -> Vector v n d -> Vector v n e -> Vector v n f -> Vector v n (a, b, c, d, e, f) Source #

zipWithM :: (Monad m, Vector v a, Vector v b, Vector v c) => (a -> b -> m c) -> Vector v n a -> Vector v n b -> m (Vector v n c) Source #

O(n) Zip the two vectors of the same length with the monadic action and yield a vector of results.

izipWithM :: (Monad m, Vector v a, Vector v b, Vector v c) => (Finite n -> a -> b -> m c) -> Vector v n a -> Vector v n b -> m (Vector v n c) Source #

O(n) Zip the two vectors with a monadic action that also takes the element index and yield a vector of results.

zipWithM_ :: (Monad m, Vector v a, Vector v b) => (a -> b -> m c) -> Vector v n a -> Vector v n b -> m () Source #

O(n) Zip the two vectors with the monadic action and ignore the results.

izipWithM_ :: (Monad m, Vector v a, Vector v b) => (Finite n -> a -> b -> m c) -> Vector v n a -> Vector v n b -> m () Source #

O(n) Zip the two vectors with a monadic action that also takes the element index and ignore the results.

Unzipping

unzip :: (Vector v a, Vector v b, Vector v (a, b)) => Vector v n (a, b) -> (Vector v n a, Vector v n b) Source #

O(min(m,n)) Unzip a vector of pairs.

unzip3 :: (Vector v a, Vector v b, Vector v c, Vector v (a, b, c)) => Vector v n (a, b, c) -> (Vector v n a, Vector v n b, Vector v n c) Source #

unzip4 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v (a, b, c, d)) => Vector v n (a, b, c, d) -> (Vector v n a, Vector v n b, Vector v n c, Vector v n d) Source #

unzip5 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v (a, b, c, d, e)) => Vector v n (a, b, c, d, e) -> (Vector v n a, Vector v n b, Vector v n c, Vector v n d, Vector v n e) Source #

unzip6 :: (Vector v a, Vector v b, Vector v c, Vector v d, Vector v e, Vector v f, Vector v (a, b, c, d, e, f)) => Vector v n (a, b, c, d, e, f) -> (Vector v n a, Vector v n b, Vector v n c, Vector v n d, Vector v n e, Vector v n f) Source #

Working with predicates

Searching

elem :: (Vector v a, Eq a) => a -> Vector v n a -> Bool infix 4 Source #

O(n) Check if the vector contains an element.

notElem :: (Vector v a, Eq a) => a -> Vector v n a -> Bool infix 4 Source #

O(n) Check if the vector does not contain an element (inverse of elem).

find :: Vector v a => (a -> Bool) -> Vector v n a -> Maybe a Source #

O(n) Yield Just the first element matching the predicate or Nothing if no such element exists.

findIndex :: Vector v a => (a -> Bool) -> Vector v n a -> Maybe (Finite n) Source #

O(n) Yield Just the index of the first element matching the predicate or Nothing if no such element exists.

elemIndex :: (Vector v a, Eq a) => a -> Vector v n a -> Maybe (Finite n) Source #

O(n) Yield Just the index of the first occurence of the given element or Nothing if the vector does not contain the element. This is a specialised version of findIndex.

Folding

foldl :: Vector v b => (a -> b -> a) -> a -> Vector v n b -> a Source #

O(n) Left fold.

foldl1 :: Vector v a => (a -> a -> a) -> Vector v (1 + n) a -> a Source #

O(n) Left fold on non-empty vectors.

foldl' :: Vector v b => (a -> b -> a) -> a -> Vector v n b -> a Source #

O(n) Left fold with strict accumulator.

foldl1' :: Vector v a => (a -> a -> a) -> Vector v (1 + n) a -> a Source #

O(n) Left fold on non-empty vectors with strict accumulator.

foldr :: Vector v a => (a -> b -> b) -> b -> Vector v n a -> b Source #

O(n) Right fold.

foldr1 :: Vector v a => (a -> a -> a) -> Vector v (n + 1) a -> a Source #

O(n) Right fold on non-empty vectors.

foldr' :: Vector v a => (a -> b -> b) -> b -> Vector v n a -> b Source #

O(n) Right fold with a strict accumulator.

foldr1' :: Vector v a => (a -> a -> a) -> Vector v (n + 1) a -> a Source #

O(n) Right fold on non-empty vectors with strict accumulator.

ifoldl :: Vector v b => (a -> Finite n -> b -> a) -> a -> Vector v n b -> a Source #

O(n) Left fold (function applied to each element and its index).

ifoldl' :: Vector v b => (a -> Finite n -> b -> a) -> a -> Vector v n b -> a Source #

O(n) Left fold with strict accumulator (function applied to each element and its index).

ifoldr :: Vector v a => (Finite n -> a -> b -> b) -> b -> Vector v n a -> b Source #

O(n) Right fold (function applied to each element and its index).

ifoldr' :: Vector v a => (Finite n -> a -> b -> b) -> b -> Vector v n a -> b Source #

O(n) Right fold with strict accumulator (function applied to each element and its index).

Specialised folds

all :: Vector v a => (a -> Bool) -> Vector v n a -> Bool Source #

O(n) Check if all elements satisfy the predicate.

any :: Vector v a => (a -> Bool) -> Vector v n a -> Bool Source #

O(n) Check if any element satisfies the predicate.

and :: Vector v Bool => Vector v n Bool -> Bool Source #

O(n) Check if all elements are True

or :: Vector v Bool => Vector v n Bool -> Bool Source #

O(n) Check if any element is True

sum :: (Vector v a, Num a) => Vector v n a -> a Source #

O(n) Compute the sum of the elements.

product :: (Vector v a, Num a) => Vector v n a -> a Source #

O(n) Compute the product of the elements.

maximum :: (Vector v a, Ord a) => Vector v (n + 1) a -> a Source #

O(n) Yield the maximum element of the non-empty vector.

maximumBy :: Vector v a => (a -> a -> Ordering) -> Vector v (n + 1) a -> a Source #

O(n) Yield the maximum element of the non-empty vector according to the given comparison function.

minimum :: (Vector v a, Ord a) => Vector v (n + 1) a -> a Source #

O(n) Yield the minimum element of the non-empty vector.

minimumBy :: Vector v a => (a -> a -> Ordering) -> Vector v (n + 1) a -> a Source #

O(n) Yield the minimum element of the non-empty vector according to the given comparison function.

maxIndex :: (Vector v a, Ord a) => Vector v (n + 1) a -> Finite (n + 1) Source #

O(n) Yield the index of the maximum element of the non-empty vector.

maxIndexBy :: Vector v a => (a -> a -> Ordering) -> Vector v (n + 1) a -> Finite (n + 1) Source #

O(n) Yield the index of the maximum element of the non-empty vector according to the given comparison function.

minIndex :: (Vector v a, Ord a) => Vector v (n + 1) a -> Finite (n + 1) Source #

O(n) Yield the index of the minimum element of the non-empty vector.

minIndexBy :: Vector v a => (a -> a -> Ordering) -> Vector v (n + 1) a -> Finite (n + 1) Source #

O(n) Yield the index of the minimum element of the non-empty vector according to the given comparison function.

foldM :: (Monad m, Vector v b) => (a -> b -> m a) -> a -> Vector v n b -> m a Source #

ifoldM :: (Monad m, Vector v b) => (a -> Finite n -> b -> m a) -> a -> Vector v n b -> m a Source #

O(n) Monadic fold (action applied to each element and its index).

fold1M :: (Monad m, Vector v a) => (a -> a -> m a) -> Vector v (1 + n) a -> m a Source #

O(n) Monadic fold over non-empty vectors.

foldM' :: (Monad m, Vector v b) => (a -> b -> m a) -> a -> Vector v n b -> m a Source #

O(n) Monadic fold with strict accumulator.

ifoldM' :: (Monad m, Vector v b) => (a -> Finite n -> b -> m a) -> a -> Vector v n b -> m a Source #

O(n) Monadic fold with strict accumulator (action applied to each element and its index).

fold1M' :: (Monad m, Vector v a) => (a -> a -> m a) -> Vector v (n + 1) a -> m a Source #

O(n) Monadic fold over non-empty vectors with strict accumulator.

foldM_ :: (Monad m, Vector v b) => (a -> b -> m a) -> a -> Vector v n b -> m () Source #

ifoldM_ :: (Monad m, Vector v b) => (a -> Finite n -> b -> m a) -> a -> Vector v n b -> m () Source #

O(n) Monadic fold that discards the result (action applied to each element and its index).

fold1M_ :: (Monad m, Vector v a) => (a -> a -> m a) -> Vector v (n + 1) a -> m () Source #

foldM'_ :: (Monad m, Vector v b) => (a -> b -> m a) -> a -> Vector v n b -> m () Source #

ifoldM'_ :: (Monad m, Vector v b) => (a -> Finite n -> b -> m a) -> a -> Vector v n b -> m () Source #

O(n) Monadic fold with strict accumulator that discards the result (action applied to each element and its index).

fold1M'_ :: (Monad m, Vector v a) => (a -> a -> m a) -> Vector v (n + 1) a -> m () Source #

O(n) Monad fold over non-empty vectors with strict accumulator that discards the result.

sequence :: (Monad m, Vector v a, Vector v (m a)) => Vector v n (m a) -> m (Vector v n a) Source #

Evaluate each action and collect the results.

sequence_ :: (Monad m, Vector v (m a)) => Vector v n (m a) -> m () Source #

Evaluate each action and discard the results.

Prefix sums (scans)

prescanl :: (Vector v a, Vector v b) => (a -> b -> a) -> a -> Vector v n b -> Vector v n a Source #

O(n) Prescan

prescanl f z = init . scanl f z


Example: prescanl (+) 0 <1,2,3,4> = <0,1,3,6>

prescanl' :: (Vector v a, Vector v b) => (a -> b -> a) -> a -> Vector v n b -> Vector v n a Source #

O(n) Prescan with strict accumulator.

postscanl :: (Vector v a, Vector v b) => (a -> b -> a) -> a -> Vector v n b -> Vector v n a Source #

O(n) Scan

postscanl' :: (Vector v a, Vector v b) => (a -> b -> a) -> a -> Vector v n b -> Vector v n a Source #

O(n) Scan with strict accumulator.

scanl :: (Vector v a, Vector v b) => (a -> b -> a) -> a -> Vector v n b -> Vector v (1 + n) a Source #

scanl' :: (Vector v a, Vector v b) => (a -> b -> a) -> a -> Vector v n b -> Vector v (1 + n) a Source #

O(n) Haskell-style scan with strict accumulator.

scanl1 :: Vector v a => (a -> a -> a) -> Vector v (1 + n) a -> Vector v (2 + n) a Source #

O(n) Scan over a non-empty vector.

scanl1' :: Vector v a => (a -> a -> a) -> Vector v (1 + n) a -> Vector v (2 + n) a Source #

O(n) Scan over a non-empty vector with a strict accumulator.

prescanr :: (Vector v a, Vector v b) => (a -> b -> b) -> b -> Vector v n a -> Vector v n b Source #

O(n) Right-to-left prescan.

prescanr' :: (Vector v a, Vector v b) => (a -> b -> b) -> b -> Vector v n a -> Vector v n b Source #

O(n) Right-to-left prescan with strict accumulator.

postscanr :: (Vector v a, Vector v b) => (a -> b -> b) -> b -> Vector v n a -> Vector v n b Source #

O(n) Right-to-left scan.

postscanr' :: (Vector v a, Vector v b) => (a -> b -> b) -> b -> Vector v n a -> Vector v n b Source #

O(n) Right-to-left scan with strict accumulator.

scanr :: (Vector v a, Vector v b) => (a -> b -> b) -> b -> Vector v n a -> Vector v (n + 1) b Source #

scanr' :: (Vector v a, Vector v b) => (a -> b -> b) -> b -> Vector v n a -> Vector v (n + 1) b Source #

O(n) Right-to-left Haskell-style scan with strict accumulator.

scanr1 :: Vector v a => (a -> a -> a) -> Vector v (n + 1) a -> Vector v (n + 2) a Source #

O(n) Right-to-left scan over a non-empty vector.

scanr1' :: Vector v a => (a -> a -> a) -> Vector v (n + 1) a -> Vector v (n + 2) a Source #

O(n) Right-to-left scan over a non-empty vector with a strict accumulator.

Conversions

Lists

toList :: Vector v a => Vector v n a -> [a] Source #

O(n) Convert a vector to a list.

fromList :: (Vector v a, KnownNat n) => [a] -> Maybe (Vector v n a) Source #

O(n) Convert a list to a vector.

fromListN :: forall v n a. (Vector v a, KnownNat n) => [a] -> Maybe (Vector v n a) Source #

O(n) Convert the first n elements of a list to a vector. The length of the resultant vector is inferred from the type.

fromListN' :: forall v n a p. (Vector v a, KnownNat n) => p n -> [a] -> Maybe (Vector v n a) Source #

O(n) Convert the first n elements of a list to a vector. The length of the resultant vector is given explicitly as a Proxy argument.

withSizedList :: forall v a r. Vector v a => [a] -> (forall n. KnownNat n => Vector v n a -> r) -> r Source #

O(n) Takes a list and returns a continuation providing a vector with a size parameter corresponding to the length of the list.

Essentially converts a list into a vector with the proper size parameter, determined at runtime.

See withSized

Other Vector types

convert :: (Vector v a, Vector w a) => Vector v n a -> Vector w n a Source #

O(n) Convert different vector types.

Mutable vectors

freeze :: (PrimMonad m, Vector v a) => MVector (Mutable v) n (PrimState m) a -> m (Vector v n a) Source #

O(n) Yield an immutable copy of the mutable vector.

thaw :: (PrimMonad m, Vector v a) => Vector v n a -> m (MVector (Mutable v) n (PrimState m) a) Source #

O(n) Yield a mutable copy of the immutable vector.

copy :: (PrimMonad m, Vector v a) => MVector (Mutable v) n (PrimState m) a -> Vector v n a -> m () Source #

O(n) Copy an immutable vector into a mutable one.

unsafeFreeze :: (PrimMonad m, Vector v a) => MVector (Mutable v) n (PrimState m) a -> m (Vector v n a) Source #

O(1) Unsafely convert a mutable vector to an immutable one withouy copying. The mutable vector may not be used after this operation.

unsafeThaw :: (PrimMonad m, Vector v a) => Vector v n a -> m (MVector (Mutable v) n (PrimState m) a) Source #

O(n) Unsafely convert an immutable vector to a mutable one without copying. The immutable vector may not be used after this operation.

Unsized Vectors

toSized :: forall v n a. (Vector v a, KnownNat n) => v a -> Maybe (Vector v n a) Source #

Convert a Vector into a Vector if it has the correct size, otherwise return Nothing.

withSized :: forall v a r. Vector v a => v a -> (forall n. KnownNat n => Vector v n a -> r) -> r Source #

Takes a Vector and returns a continuation providing a Sized with a size parameter n that is determined at runtime based on the length of the input vector.

Essentially converts a Vector into a Vector with the correct size parameter n.

fromSized :: Vector v n a -> v a Source #

withVectorUnsafe :: (v a -> w b) -> Vector v n a -> Vector w n b Source #

Apply a function on unsized vectors to a sized vector. The function must preserve the size of the vector, this is not checked.

zipVectorsUnsafe :: (u a -> v b -> w c) -> Vector u n a -> Vector v n b -> Vector w n c Source #

Apply a function on two unsized vectors to sized vectors. The function must preserve the size of the vectors, this is not checked.

Orphan instances

 KnownNat n => Monad (Vector Vector n) Source # Treats a Vector n a as, essentially, a Finite n -> a, and emulates the Monad instance for that function.join :: Vector n (Vector n a) -> Vector n a gets the diagonal from a square "matrix". Instance details Methods(>>=) :: Vector Vector0 n a -> (a -> Vector Vector0 n b) -> Vector Vector0 n b #(>>) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n b #return :: a -> Vector Vector0 n a # Source # The Applicative instance for sized vectors does not have the same behaviour as the Applicative instance for the unsized vectors found in the vectors package. The instance defined here has the same behaviour as the ZipList instance. Instance details Methodspure :: a -> Vector Vector0 n a #(<*>) :: Vector Vector0 n (a -> b) -> Vector Vector0 n a -> Vector Vector0 n b #liftA2 :: (a -> b -> c) -> Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n c #(*>) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n b #(<*) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n a # Source # Instance details Methodsdistribute :: Functor f => f (Vector Vector0 n a) -> Vector Vector0 n (f a) #collect :: Functor f => (a -> Vector Vector0 n b) -> f a -> Vector Vector0 n (f b) #distributeM :: Monad m => m (Vector Vector0 n a) -> Vector Vector0 n (m a) #collectM :: Monad m => (a -> Vector Vector0 n b) -> m a -> Vector Vector0 n (m b) # Source # Instance details Associated Typestype Rep (Vector Vector n) # Methodstabulate :: (Rep (Vector Vector0 n) -> a) -> Vector Vector0 n a #index :: Vector Vector0 n a -> Rep (Vector Vector0 n) -> a # (KnownNat n, n ~ (1 + m)) => Comonad (Vector Vector n) Source # Non-empty sized vectors are lawful comonads.extract is headduplicate generates all unique sequences of a vector with the same length as it, using wrap-around.e.g.  duplicate [1,2,3,4,5] = [[1,2,3,4,5], [2,3,4,5,1], [3,4,5,1,2], [4,5,1,2,3], [5,1,2,3,4]]  Instance details Methodsextract :: Vector Vector0 n a -> a #duplicate :: Vector Vector0 n a -> Vector Vector0 n (Vector Vector0 n a) #extend :: (Vector Vector0 n a -> b) -> Vector Vector0 n a -> Vector Vector0 n b # (KnownNat n, n ~ (1 + m)) => ComonadApply (Vector Vector n) Source # Instance details Methods(<@>) :: Vector Vector0 n (a -> b) -> Vector Vector0 n a -> Vector Vector0 n b #(@>) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n b #(<@) :: Vector Vector0 n a -> Vector Vector0 n b -> Vector Vector0 n a # (Vector v a, Floating a, KnownNat n) => Floating (Vector v n a) Source # Instance details Methodspi :: Vector v n a #exp :: Vector v n a -> Vector v n a #log :: Vector v n a -> Vector v n a #sqrt :: Vector v n a -> Vector v n a #(**) :: Vector v n a -> Vector v n a -> Vector v n a #logBase :: Vector v n a -> Vector v n a -> Vector v n a #sin :: Vector v n a -> Vector v n a #cos :: Vector v n a -> Vector v n a #tan :: Vector v n a -> Vector v n a #asin :: Vector v n a -> Vector v n a #acos :: Vector v n a -> Vector v n a #atan :: Vector v n a -> Vector v n a #sinh :: Vector v n a -> Vector v n a #cosh :: Vector v n a -> Vector v n a #tanh :: Vector v n a -> Vector v n a #asinh :: Vector v n a -> Vector v n a #acosh :: Vector v n a -> Vector v n a #atanh :: Vector v n a -> Vector v n a #log1p :: Vector v n a -> Vector v n a #expm1 :: Vector v n a -> Vector v n a #log1pexp :: Vector v n a -> Vector v n a #log1mexp :: Vector v n a -> Vector v n a # (Vector v a, Fractional a, KnownNat n) => Fractional (Vector v n a) Source # Instance details Methods(/) :: Vector v n a -> Vector v n a -> Vector v n a #recip :: Vector v n a -> Vector v n a #fromRational :: Rational -> Vector v n a # (Vector v a, Num a, KnownNat n) => Num (Vector v n a) Source # Instance details Methods(+) :: Vector v n a -> Vector v n a -> Vector v n a #(-) :: Vector v n a -> Vector v n a -> Vector v n a #(*) :: Vector v n a -> Vector v n a -> Vector v n a #negate :: Vector v n a -> Vector v n a #abs :: Vector v n a -> Vector v n a #signum :: Vector v n a -> Vector v n a #fromInteger :: Integer -> Vector v n a # (KnownNat n, Vector v a, Read (v a)) => Read (Vector v n a) Source # Instance details MethodsreadsPrec :: Int -> ReadS (Vector v n a) #readList :: ReadS [Vector v n a] #readPrec :: ReadPrec (Vector v n a) #readListPrec :: ReadPrec [Vector v n a] # (Semigroup g, Vector v g) => Semigroup (Vector v n g) Source # The Semigroup instance for sized vectors does not have the same behaviour as the Semigroup instance for the unsized vectors found in the vectors package. This instance has (<>) = zipWith (<>), but vectors uses concatentation. Instance details Methods(<>) :: Vector v n g -> Vector v n g -> Vector v n g #sconcat :: NonEmpty (Vector v n g) -> Vector v n g #stimes :: Integral b => b -> Vector v n g -> Vector v n g # (Monoid m, Vector v m, KnownNat n) => Monoid (Vector v n m) Source # The Monoid instance for sized vectors does not have the same behaviour as the Monoid instance for the unsized vectors found in the vectors package. This instance has mempty = replicate mempty and mappend = zipWith mappend, where the vectors instance uses the empty vector and concatenation.If mempty is not necessary, using the Semigroup instance over this Monoid will dodge the KnownNat constraint. Instance details Methodsmempty :: Vector v n m #mappend :: Vector v n m -> Vector v n m -> Vector v n m #mconcat :: [Vector v n m] -> Vector v n m # (KnownNat n, Storable a, Vector v a) => Storable (Vector v n a) Source # Any sized vector containing Storable elements is itself Storable. Instance details MethodssizeOf :: Vector v n a -> Int #alignment :: Vector v n a -> Int #peekElemOff :: Ptr (Vector v n a) -> Int -> IO (Vector v n a) #pokeElemOff :: Ptr (Vector v n a) -> Int -> Vector v n a -> IO () #peekByteOff :: Ptr b -> Int -> IO (Vector v n a) #pokeByteOff :: Ptr b -> Int -> Vector v n a -> IO () #peek :: Ptr (Vector v n a) -> IO (Vector v n a) #poke :: Ptr (Vector v n a) -> Vector v n a -> IO () # (Vector v a, Bits (v a), Bits a, KnownNat n) => Bits (Vector v n a) Source # Only usable if v a is itself an instance of Bits, like in the case with the bitvec library Bit type for unboxed vectors. Instance details Methods(.&.) :: Vector v n a -> Vector v n a -> Vector v n a #(.|.) :: Vector v n a -> Vector v n a -> Vector v n a #xor :: Vector v n a -> Vector v n a -> Vector v n a #complement :: Vector v n a -> Vector v n a #shift :: Vector v n a -> Int -> Vector v n a #rotate :: Vector v n a -> Int -> Vector v n a #zeroBits :: Vector v n a #bit :: Int -> Vector v n a #setBit :: Vector v n a -> Int -> Vector v n a #clearBit :: Vector v n a -> Int -> Vector v n a #complementBit :: Vector v n a -> Int -> Vector v n a #testBit :: Vector v n a -> Int -> Bool #bitSizeMaybe :: Vector v n a -> Maybe Int #bitSize :: Vector v n a -> Int #isSigned :: Vector v n a -> Bool #shiftL :: Vector v n a -> Int -> Vector v n a #unsafeShiftL :: Vector v n a -> Int -> Vector v n a #shiftR :: Vector v n a -> Int -> Vector v n a #unsafeShiftR :: Vector v n a -> Int -> Vector v n a #rotateL :: Vector v n a -> Int -> Vector v n a #rotateR :: Vector v n a -> Int -> Vector v n a #popCount :: Vector v n a -> Int # (Vector v a, Bits (v a), FiniteBits a, KnownNat n) => FiniteBits (Vector v n a) Source # Treats a bit vector as n times the size of the stored bits, reflecting the Bits instance; does not necessarily reflect exact in-memory representation. See Storable instance to get information on the actual in-memry representation. Instance details MethodsfiniteBitSize :: Vector v n a -> Int #countLeadingZeros :: Vector v n a -> Int #countTrailingZeros :: Vector v n a -> Int # (Vector v a, Binary a, KnownNat n) => Binary (Vector v n a) Source # Instance details Methodsput :: Vector v n a -> Put #get :: Get (Vector v n a) #putList :: [Vector v n a] -> Put # (Eq a, Hashable a, Unbox a) => Hashable (Vector Vector n a) Source # Instance details MethodshashWithSalt :: Int -> Vector Vector0 n a -> Int #hash :: Vector Vector0 n a -> Int # (Eq a, Hashable a, Storable a) => Hashable (Vector Vector n a) Source # Instance details MethodshashWithSalt :: Int -> Vector Vector0 n a -> Int #hash :: Vector Vector0 n a -> Int # (Eq a, Hashable a) => Hashable (Vector Vector n a) Source # Instance details MethodshashWithSalt :: Int -> Vector Vector0 n a -> Int #hash :: Vector Vector0 n a -> Int #